Kubernetes生成自签名证书教程介绍
2020 年,谷歌浏览器更改了SameSite=None
cookie的行为,要求激活该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
接下来,使用在线提供的kubectl apply
命令和yaml
文件来安装附加组件:
kubectl apply --validate=false -f https://github.com/jetstack/cert-manager/releases/download/v0.13.1/cert-manager.yaml
步骤 2:创建证书颁发者
创建一个命名空间,你将在其中生成证书:
kubectl create namespace [namespace]
接下来,通过在终端中键入以下多行命令来定义证书颁发者:
kubectl apply -n [namespace] -f <(echo "
apiVersion: cert-manager.io/v1alpha2
kind: Issuer
metadata:
name: [issuer-name]
spec:
selfSigned: {}
")
输出确认发行人创建成功:
以这种方式创建的颁发者仅适用于当前命名空间。如果你希望能够从集群中的任何命名空间请求证书,请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生成自签名证书教程:要检查你创建的证书,请键入:
kubectl -n [namespace] get certificate
要查看有关 Secret 的信息,请使用以下get secret
命令:
kubectl -n [namespace] get secret [secret-name]
包含在这个秘密的三个键ca.crt
,tls.crt
和tls.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
该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
然后,使用 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.pem
和ca-key.pem
文件cfssl
:
cfssl gencert -initca ca.json | cfssljson -bare ca
步骤 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.csr
和intermediate_ca-key.pem
文件,并签署中间 CA:
cfssl gencert -initca intermediate-ca.json | cfssljson -bare intermediate_ca
然后,使用 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
步骤 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
要生成服务器证书,请键入:
cfssl gencert -ca intermediate_ca.pem -ca-key intermediate_ca-key.pem -config cfssl.json -profile=server host1.json | cfssljson -bare host-1-server
客户端证书的语法(通常不需要但某些系统支持)是:
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如何生成自签名证书:通过 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
解压你下载的存档:
tar xzf easy-rsa.tar.gz
进入easy-rsa-3.0.1/easyrsa3
目录:
cd easy-rsa-master/easyrsa3
进入该文件夹后,键入以下命令以完成 Easy-RSA 的设置:
./easyrsa init-pki
注意: Curl 是在开发中忽略证书错误的有用工具。了解如何让 curl 忽略 SSL 错误。
步骤 2:创建自签名 CA
Kubernetes生成自签名证书教程:要开始创建自签名 CA,请使用以下命令:
./easyrsa build-ca
系统会要求你输入 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
系统会要求你重复你在上一步中创建的密码。然后,输出确认数据库已更新为新条目。将pki/ca.crt
,pki/issued/server.crt
和pki/private/server.key
文件复制到你的目录中。
如何为Kubernetes生成自签名证书:通过 OpenSSL 生成证书
OpenSSL允许你手动生成 TLS 证书。以下步骤显示了如何使用 OpenSSL 为你的集群生成密钥和证书。
第 1 步:安装 OpenSSL
该OpenSSL的工具通常预装Linux系统。通过键入以下命令检查你是否安装了它:
openssl version -a
输出如下所示:
如果你收到一条消息说你的系统上没有 OpenSSL,请使用你的发行版的包管理器安装该工具。
例如:
sudo apt install openssl
步骤 2:生成证书文件
使用以下命令生成用于证书签名的 2048 位 RSA 加密密钥:
openssl genrsa -out ca.key 2048
现在,使用ca.key
生成ca.crt
. 使用-days
选项设置证书有效期的长度:
openssl req -x509 -new -nodes -key ca.key -subj "/CN=[master-ip-address]" -days [number] -out ca.crt
如果没有发生错误,则该命令不会产生任何输出。
最后,生成server.key
2048位RSA加密的文件:
openssl genrsa -out server.key 2048
步骤 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
此多行命令的输出确认证书的创建并列出你从配置文件中获取的数据:
要查看你创建的证书,请键入:
openssl x509 -noout -text -in ./server.crt
结论
如何为Kubernetes生成自签名证书?本文列出了使用四种方法为 Kubernetes 生成自签名证书所需的步骤:cert-manager、CFSSL、Easy-RSA和OpenSSL。
虽然不应在生产中使用自签名证书,但它们提供了一种简单的方法来测试你使用Kubernetes部署的 Web UI 应用程序。