如何为Kubernetes生成自签名证书?详细操作指南

2021年11月20日16:20:48 发表评论 1,720 次浏览

Kubernetes生成自签名证书教程介绍

2020 年,谷歌浏览器更改了SameSite=Nonecookie的行为,要求激活该Secure选项。因此,测试其 API 后端在本地 Kubernetes 集群中运行的 Web UI 客户端现在需要 HTTPS 访问。

Kubernetes如何生成自签名证书?在本教程中,你将学习如何通过使用 cert-manager、CFSSL、Easy-RSA 和 OpenSSL 方法为 Kubernetes 生成自签名证书来获取 HTTPS 访问。

先决条件

  • 一个Kubernetes 集群(你可以使用minikube创建它)
  • 安装了kubectl命令行工具

如何为Kubernetes生成自签名证书:通过 cert-manager 生成证书

作为原生 Kubernetes 证书管理控制器,cert-manager插件是生成自签名证书的最常见方式。

第一步:安装证书管理器

要安装 cert-manager,首先要为其创建一个命名空间:

kubectl create namespace cert-manager
如何为Kubernetes生成自签名证书?详细操作指南

接下来,使用在线提供的kubectl apply命令和yaml文件来安装附加组件:

kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.13.1/cert-manager.yaml
如何为Kubernetes生成自签名证书?详细操作指南

步骤 2:创建证书颁发者

创建一个命名空间,你将在其中生成证书:

kubectl create namespace [namespace]
如何为Kubernetes生成自签名证书?详细操作指南

接下来,通过在终端中键入以下多行命令来定义证书颁发者:

kubectl apply -n [namespace] -f <(echo "
apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
  name: [issuer-name]
spec:
  selfSigned: {}
")

输出确认发行人创建成功:

如何为Kubernetes生成自签名证书?详细操作指南

以这种方式创建的颁发者仅适用于当前命名空间。如果你希望能够从集群中的任何命名空间请求证书,请ClusterIssuer使用可用selfsigned-issuer.yaml文件创建一个自定义 Kubernetes 资源:

kubectl apply -f https://gist.githubusercontent.com/t83714/51440e2ed212991655959f45d8d037cc/raw/7b16949f95e2dd61e522e247749d77bc697fd63c/selfsigned-issuer.yaml

第 3 步:生成证书

Kubernetes如何生成自签名证书:通过在终端中键入以下多行命令来生成自签名证书:

kubectl apply -n [namespace]-f <(echo '
apiVersion: cert-manager.io/v1alpha2
kind: Certificate
metadata:
  name: [certificate-name]
spec:
  secretName: [secret-name]
  dnsNames:
  - "*.[namespace].svc.cluster.local"
  - "*.[namespace]"
  issuerRef:
    name: [issuer-name]
')

输出确认创建成功:

如何为Kubernetes生成自签名证书?详细操作指南

Kubernetes生成自签名证书教程:要检查你创建的证书,请键入:

kubectl -n [namespace] get certificate
如何为Kubernetes生成自签名证书?详细操作指南

要查看有关 Secret 的信息,请使用以下get secret命令:

kubectl -n [namespace] get secret [secret-name]
如何为Kubernetes生成自签名证书?详细操作指南

包含在这个秘密的三个键ca.crttls.crttls.key。对于整个 Secret,键入:

kubectl -n [namespace] get secret [secret-name] -o yaml

注意:了解有关Kubernetes 机密的更多信息,对象存储敏感数据。

第 4 步:测试证书

使用以下命令测试证书的有效性:

openssl x509 -in <(kubectl -n [namespace] get secret \
  first-tls -o jsonpath='{.data.tls\.crt}' | base64 -d) \
  -text -noout
如何为Kubernetes生成自签名证书?详细操作指南

X509v3 Subject Alternative Name行应包含dnsNames你在证书生成期间提供的内容。

通过 CFSSL 生成证书

如何为Kubernetes生成自签名证书?另一个用于生成和验证自签名证书的常用工具是CFSSL。该工具由四个程序组成:

  • cfssl – 用于 CFSSL 包管理的命令行实用程序。
  • multirootca – 证书颁发机构服务器。
  • mkbundle – 证书池捆绑构建器。
  • cfssljson– 使用json来自cfssl和 的输出的证书生成器multirootca

以下步骤显示了如何使用 CFSSL 生成自签名证书。

第 1 步:使用 Go 安装 CFSSL

要安装 CFSSL,首先需要安装必要的 Go 语言包。输入以下命令:

sudo apt install golang
如何为Kubernetes生成自签名证书?详细操作指南

然后,使用 Go 语法下载cfssl

go get -u github.com/cloudflare/cfssl/cmd/cfssl

接下来,将文件复制~/go/bin到相应的文件夹中:

sudo cp ~/go/bin/cfssl /usr/local/bin/cfssl

最后,重复这个过程cfssljson

go get -u github.com/cloudflare/cfssl/cmd/cfssljson
sudo cp ~/go/bin/cfssljson /usr/local/bin/cfssljson

第 2 步:创建证书颁发机构

安装程序后,继续创建自签名证书颁发机构 (CA)。下面的示例创建了一个名为ca.json.

该文件定义了以下内容:

  • CN – 权威的通用名称
  • algo – 用于证书的算法
  • size – 算法大小(以位为单位)
  • C - 国家
  • L – 地区(城市)
  • ST – 州或省
  • O - 组织
  • OU - 组织单元

以下示例针对名为“Example Company”的组织及其位于美国纽约州纽约市的组织单位“Example Company Root CA”。

{
  "CN": "Example Company Root CA",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
  {
    "C": "US",
    "L": "New York",
    "ST": "New York",
    "O": "Example Company",
    "OU": "Example Company Root CA"
  }
 ]
}

json在文本编辑器中创建并保存文件。然后,通过键入以下命令使用它生成ca.pemca-key.pem文件cfssl

cfssl gencert -initca ca.json | cfssljson -bare ca
如何为Kubernetes生成自签名证书?详细操作指南

步骤 3:创建配置文件

要继续,请创建cfssl.json配置文件。该文件提供有关证书到期日期和单独配置文件(对等方、服务器和客户端)使用情况的详细信息。

cfssl.json应该是这样的:

{
  "signing": {
    "default": {
      "expiry": "8760h"
    },
    "profiles": {
      "intermediate_ca": {
        "usages": [
            "signing",
            "digital signature",
            "key encipherment",
            "cert sign",
            "crl sign",
            "server auth",
            "client auth"
        ],
        "expiry": "8760h",
        "ca_constraint": {
            "is_ca": true,
            "max_path_len": 0, 
            "max_path_len_zero": true
        }
      },
      "peer": {
        "usages": [
            "signing",
            "digital signature",
            "key encipherment", 
            "client auth",
            "server auth"
        ],
        "expiry": "8760h"
      },
      "server": {
        "usages": [
          "signing",
          "digital signing",
          "key encipherment",
          "server auth"
        ],
        "expiry": "8760h"
      },
      "client": {
        "usages": [
          "signing",
          "digital signature",
          "key encipherment", 
          "client auth"
        ],
        "expiry": "8760h"
      }
    }
  }
}

保存文件并退出。

步骤 4:创建中间证书颁发机构

json你必须创建的另一个文件是intermediate-ca.json. 它定义了中间证书颁发机构,看起来类似于之前创建的ca.json

{
  "CN": " Example Company Intermediate CA",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "New York",
      "ST": "New York",
      "O": "Example Company",
      "OU": "Example Company Intermediate CA"
    }
  ],
  "ca": {
    "expiry": "42720h"
  }
}

第 5 步:签署证书

如何为Kubernetes生成自签名证书?创建两个文件后,键入以下命令以创建intermediate_ca.pem,intermediate_ca.csrintermediate_ca-key.pem文件,并签署中间 CA:

cfssl gencert -initca intermediate-ca.json | cfssljson -bare intermediate_ca
如何为Kubernetes生成自签名证书?详细操作指南

然后,使用 CA 和 cfssl.json 配置文件签署证书:

cfssl sign -ca ca.pem -ca-key ca-key.pem -config cfssl.json -profile intermediate_ca intermediate_ca.csr | cfssljson -bare intermediate_ca
如何为Kubernetes生成自签名证书?详细操作指南

步骤 6:生成主机证书

Kubernetes生成自签名证书教程:要为对等方、服务器和客户端配置文件生成主机证书,请创建host1.json包含有关主机的必要信息的文件。

{
  "CN": "host.example-company.com",
  "key": {
    "algo": "rsa",
    "size": 2048
  },
  "names": [
    {
      "C": "US",
      "L": "New York",
      "O": "Example Company",
      "OU": "Example Company Intermediate CA",
      "ST": "New York"
    }

  ],
  "hosts": [
    "host1.example-company.com",
    "localhost"
  ]
}

注意:不同的服务器和客户端可能需要上述json文件的不同变体。有些只需要通用名称 (CN) 并且不检查该hosts部分。其他人需要在该部分中说明IP 地址hosts

现在,使用你创建的配置文件生成证书。对于允许服务器之间通信的对等证书,键入:

cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cfssl.json -profile=peer host1.json | cfssljson -bare host-1-peer
如何为Kubernetes生成自签名证书?详细操作指南

要生成服务器证书,请键入:

cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cfssl.json -profile=server host1.json | cfssljson -bare host-1-server
如何为Kubernetes生成自签名证书?详细操作指南

客户端证书的语法(通常不需要但某些系统支持)是:

cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cfssl.json -profile=client host1.json | cfssljson -bare host-1-client
如何为Kubernetes生成自签名证书?详细操作指南

相应的输出确认证书的成功生成。

Kubernetes如何生成自签名证书:通过 Easy-RSA 生成证书

Easy-RSA是一种流行的实用程序,用于创建根证书颁发机构、请求和签署证书。

第 1 步:安装 Easy-RSA

要下载 Easy-RSA 软件包,你需要 curl。如果你没有安装 curl,请输入以下命令进行安装:

sudo apt install curl

现在,键入以下 curl 命令:

Curl -LO https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz
如何为Kubernetes生成自签名证书?详细操作指南

解压你下载的存档:

tar xzf easy-rsa.tar.gz

进入easy-rsa-3.0.1/easyrsa3目录:

cd easy-rsa-master/easyrsa3

进入该文件夹后,键入以下命令以完成 Easy-RSA 的设置:

./easyrsa init-pki
如何为Kubernetes生成自签名证书?详细操作指南

注意: Curl 是在开发中忽略证书错误的有用工具。了解如何让 curl 忽略 SSL 错误。

步骤 2:创建自签名 CA

Kubernetes生成自签名证书教程:要开始创建自签名 CA,请使用以下命令:

./easyrsa build-ca
如何为Kubernetes生成自签名证书?详细操作指南

系统会要求你输入 PEM 密码来加密ca.key文件。接下来,提示要求你输入有关你正在创建的 CA 的信息。

注意:系统可能会要求你提供比你在上面的屏幕截图中看到的更多的详细信息。如果询问你有关组织单位 ( OU) 的问题,请确保将默认值 ( IT)替换为ROOT-CA

第 3 步:生成服务器证书和密钥

Kubernetes如何生成自签名证书?下一步是使用如下所示的多行命令生成服务器证书和密钥。该--subject-alt-name选项设置用于访问 API 服务器的 IP 地址和 DNS 名称。

--days选项控制证书有效期的长度。

cluster.local 是默认的 DNS 域名。

./easyrsa --subject-alt-name="IP:[master-IP-address]," \
"IP:[master-cluster-IP-address]," \
"DNS:kubernetes," \
"DNS:kubernetes.default," \
"DNS:kubernetes.default.svc," \
"DNS:kubernetes.default.svc.cluster," \
"DNS:kubernetes.default.svc.cluster.local" \ 
--days=10000 \
build-server-full server nopass
如何为Kubernetes生成自签名证书?详细操作指南

系统会要求你重复你在上一步中创建的密码。然后,输出确认数据库已更新为新条目。将pki/ca.crt,pki/issued/server.crtpki/private/server.key文件复制到你的目录中。

如何为Kubernetes生成自签名证书:通过 OpenSSL 生成证书

OpenSSL允许你手动生成 TLS 证书。以下步骤显示了如何使用 OpenSSL 为你的集群生成密钥和证书。

第 1 步:安装 OpenSSL

OpenSSL的工具通常预装Linux系统。通过键入以下命令检查你是否安装了它:

openssl version -a

输出如下所示:

如何为Kubernetes生成自签名证书?详细操作指南

如果你收到一条消息说你的系统上没有 OpenSSL,请使用你的发行版的包管理器安装该工具。

例如:

sudo apt install openssl

步骤 2:生成证书文件

使用以下命令生成用于证书签名的 2048 位 RSA 加密密钥:

openssl genrsa -out ca.key 2048
如何为Kubernetes生成自签名证书?详细操作指南

现在,使用ca.key生成ca.crt. 使用-days选项设置证书有效期的长度:

openssl req -x509 -new -nodes -key ca.key -subj "/CN=[master-ip-address]" -days [number] -out ca.crt

如果没有发生错误,则该命令不会产生任何输出。

最后,生成server.key2048位RSA加密的文件:

openssl genrsa -out server.key 2048
如何为Kubernetes生成自签名证书?详细操作指南

步骤 3:创建证书配置文件

Kubernetes生成自签名证书教程:创建csr.conf用于生成证书签名请求 (CSR)的配置文件。下面的示例文件还假定你使用的cluster.local是默认 DNS 域名。

[ req ]
default_bits = 2048
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn

[ dn ]
C = [country]
ST = [state]
L = [city]
O = [company]
OU = [organization-unit]
CN = [common-name]

[ req_ext ]
subjectAltName = @alt_names

[ alt_names ]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster
DNS.5 = kubernetes.default.svc.cluster.local
IP.1 = [MASTER_IP]
IP.2 = [MASTER_CLUSTER_IP]

[ v3_ext ]
authorityKeyIdentifier=keyid,issuer:always
basicConstraints=CA:FALSE
keyUsage=keyEncipherment,dataEncipherment
extendedKeyUsage=serverAuth,clientAuth
subjectAltName=@alt_names

确保将方括号中的解释替换为实际值。保存文件并使用它来生成证书签名请求:

openssl req -new -key server.key -out server.csr -config csr.conf

该命令不产生任何输出,但会创建server.csr文件。

第 4 步:生成证书

Kubernetes如何生成自签名证书?将你在上一步中生成的文件与ca.key和一起使用ca.crt以创建服务器证书:

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 10000 \
-extensions v3_ext -extfile csr.conf

此多行命令的输出确认证书的创建并列出你从配置文件中获取的数据:

如何为Kubernetes生成自签名证书?详细操作指南

要查看你创建的证书,请键入:

openssl x509 -noout -text -in ./server.crt
如何为Kubernetes生成自签名证书?详细操作指南

结论

如何为Kubernetes生成自签名证书?本文列出了使用四种方法为 Kubernetes 生成自签名证书所需的步骤:cert-managerCFSSLEasy-RSAOpenSSL

虽然不应在生产中使用自签名证书,但它们提供了一种简单的方法来测试你使用Kubernetes部署的 Web UI 应用程序。

木子山

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: