Kubernetes 證書生成方法easyrsa openssl cfssl

轉載官網
地址:https://kubernetes.io/zh/docs/concepts/cluster-administration/certificates/

當使用客戶端證書進行認證時,用戶可以使用現有部署腳本,或者通過 easyrsa、openssl 或 cfssl 手動生成證書。

分發自簽名 CA 證書
證書 API
easyrsa
使用 easyrsa 能夠手動地爲集羣生成證書。

下載、解壓並初始化 easyrsa3 的補丁版本。

curl -LO https://storage.googleapis.com/kubernetes-release/easy-rsa/easy-rsa.tar.gz
tar xzf easy-rsa.tar.gz
cd easy-rsa-master/easyrsa3
./easyrsa init-pki
生成 CA(通過 --batch 參數設置自動模式。 通過 --req-cn 設置默認使用的 CN)

./easyrsa --batch "--req-cn=${MASTER_IP}@date +%s" build-ca nopass
生成服務器證書和密鑰。 參數 --subject-alt-name 設置了訪問 API 服務器時可能使用的 IP 和 DNS 名稱。 MASTER_CLUSTER_IP 通常爲 --service-cluster-ip-range 參數中指定的服務 CIDR 的 首個 IP 地址,--service-cluster-ip-range 同時用於 API 服務器和控制器管理器組件。 --days 參數用於設置證書的有效期限。 下面的示例還假設用戶使用 cluster.local 作爲默認的 DNS 域名。

./easyrsa --subject-alt-name="IP:${MASTER_IP},"\
"IP:${MASTER_CLUSTER_IP},"\
"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 至您的目錄。

填充並在 API 服務器的啓動參數中添加以下參數:

--client-ca-file=/yourdirectory/ca.crt
--tls-cert-file=/yourdirectory/server.crt
--tls-private-key-file=/yourdirectory/server.key
openssl
使用 openssl 能夠手動地爲集羣生成證書。

生成密鑰位數爲 2048 的 ca.key:

openssl genrsa -out ca.key 2048
依據 ca.key 生成 ca.crt (使用 -days 參數來設置證書有效時間):

openssl req -x509 -new -nodes -key ca.key -subj "/CN=${MASTER_IP}" -days 10000 -out ca.crt
生成密鑰位數爲 2048 的 server.key:

openssl genrsa -out server.key 2048
創建用於生成證書籤名請求(CSR)的配置文件。 確保在將其保存至文件(如 csr.conf)之前將尖括號標記的值(如 <MASTER_IP>) 替換爲你想使用的真實值。 注意:MASTER_CLUSTER_IP 是前面小節中描述的 API 服務器的服務集羣 IP (service cluster IP)。 下面的示例也假設用戶使用 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 = <organization>
OU = <organization unit>
CN = <MASTER_IP>

[ 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 ]br/>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
使用 ca.key、ca.crt 和 server.csr 生成服務器證書:

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
最後,添加同樣的參數到 API 服務器的啓動參數中。

cfssl
cfssl 是另一種用來生成證書的工具。

按如下所示的方式下載、解壓並準備命令行工具。 注意:你可能需要基於硬件架構和你所使用的 cfssl 版本對示例命令進行修改。

curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o cfssl
chmod +x cfssl
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o cfssljson
chmod +x cfssljson
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o cfssl-certinfo
chmod +x cfssl-certinfo
創建目錄來存放物料,並初始化 cfssl:

mkdir cert
cd cert
../cfssl print-defaults config > config.json
../cfssl print-defaults csr > csr.json
創建用來生成 CA 文件的 JSON 配置文件,例如 ca-config.json:

{
"signing": {
"default": {
"expiry": "8760h"
},
"profiles": {
"kubernetes": {
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
],
"expiry": "8760h"
}
}
}
}
創建用來生成 CA 證書籤名請求(CSR)的 JSON 配置文件,例如 ca-csr.json。 確保將尖括號標記的值替換爲你想使用的真實值。

{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names":[{
"C": "<country>",
"ST": "<state>",
"L": "<city>",
"O": "<organization>",
"OU": "<organization unit>"
}]
}
生成 CA 密鑰(ca-key.pem)和證書(ca.pem):

../cfssl gencert -initca ca-csr.json | ../cfssljson -bare ca
按如下所示的方式創建用來爲 API 服務器生成密鑰和證書的 JSON 配置文件。 確保將尖括號標記的值替換爲你想使用的真實值。 MASTER_CLUSTER_IP 是前面小節中描述的 API 服務器的服務集羣 IP。 下面的示例也假設用戶使用 cluster.local 作爲默認的 DNS 域名。

{
"CN": "kubernetes",
"hosts": [
"127.0.0.1",
"<MASTER_IP>",
"<MASTER_CLUSTER_IP>",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [{
"C": "<country>",
"ST": "<state>",
"L": "<city>",
"O": "<organization>",
"OU": "<organization unit>"
}]
}
爲 API 服務器生成密鑰和證書,生成的祕鑰和證書分別默認保存在文件 server-key.pem 和 server.pem 中:

../cfssl gencert -ca=ca.pem -ca-key=ca-key.pem \
--config=ca-config.json -profile=kubernetes \
server-csr.json | ../cfssljson -bare server
分發自簽名 CA 證書
客戶端節點可能拒絕承認自簽名 CA 證書有效。 對於非生產環境的部署,或運行在企業防火牆後的部署,用戶可以向所有客戶端分發自簽名 CA 證書, 並刷新本地的有效證書列表。

在每個客戶端上執行以下操作:

sudo cp ca.crt /usr/local/share/ca-certificates/kubernetes.crt
sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....
done.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章