cfssl ca證書有效期修改
作者 |
劉暢 |
時間 |
2022-02-20 |
目錄
前言: 之前使用二進制方式部署的k8s高可用集群證書有限期為5年(原因: ca證書默認有限期為5年),時間有點短
,如果證書過期還要重新生成證書,比較麻煩,於是研究一下cfssl如何生成有限期較長的ca證書,比如效期為100
年,下面為驗證過程。
cfssl是一個開源的證書管理工具,使用json文件生成證書,相比openssl更方便使用。
# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64
# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64
# wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64
# chmod +x cfssl_linux-amd64 cfssljson_linux-amd64 cfssl-certinfo_linux-amd64
# mv cfssl_linux-amd64 /usr/local/bin/cfssl
# mv cfssljson_linux-amd64 /usr/local/bin/cfssljson
# mv cfssl-certinfo_linux-amd64 /usr/bin/cfssl-certinfo
1 自簽證書頒發機構(CA)
# mkdir -p /root/k8s_tls_5/
# cd /root/k8s_tls_5/
生成CA默認配置文件和默認簽名請求文件的方法(使用時根據需要修改默認配置)
# cfssl print-defaults config > ca-config.json
# cfssl print-defaults csr > ca-csr.json
(1) cfssl的配置文件
# cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "87600h"
},
"profiles": {
"kubernetes": {
"expiry": "87600h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
注:
1) ca-config.json # 可以定義多個profiles,分別指定不同的過期時間、使用場景等參數,后續在簽名
證書時使用某個profile參數配置服務證書的有效期。
2) signing # 表示該證書可用於簽名其它證書,生成的ca.pem證書中CA=TRUE。
3) server auth # 表示client可以用該CA對server提供的證書進行驗證。
4) client auth # 表示 server 可以用該CA對client提供的證書進行驗證。
(2) 自簽CA 證書簽名請求文件
# cat > ca-csr.json << EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
(3) 生成CA證書和私鑰
# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
注: 生成以ca開頭證書頒發機構(CA)的文件有ca.csr、ca-key.pem、ca.pem
(4) 驗證ca證書ca.pem
# cfssl certinfo -cert ca.pem |grep not
# 可以看到ca證書的有效期是5年。
驗證網站: https://myssl.com/cert_decode.html
驗證信息如下:
2 使用自簽CA簽發kube-apiserver HTTPS證書
(1) 創建kube-apiserver證書簽名請求文件(使用CN)
# cat > kube-apiserver-csr.json << EOF
{
"CN": "kube-apiserver",
"hosts": [
"k8s-master1",
"k8s-master2",
"127.0.0.1",
"172.16.1.81",
"10.0.0.81",
"172.16.1.82",
"10.0.0.82",
"172.16.1.80",
"172.28.0.1",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
注:
CN # Common Name,kube-apiserver從證書中提取該字段作為請求的用戶名(User Name),瀏覽
器使用該字段驗證網站是否合法。RBAC,用於client auth,放到客戶端證書中。
O # Organization,kube-apiserver從證書中提取該字段作為請求用戶所屬的組(Group)。RBAC,
用於client auth,放到客戶端證書中。
# 上述文件hosts字段中指定授權使用該證書的IP或者域名列表,為所有Master/LB/VIP IP/apiserver
集群內部cluster ip(指定的service-cluster-ip-range 網段的第一個IP "${CLUSTER_KUBERNETES_SVC_IP}")一個都不能少,為了方便后期擴容可以多寫幾個預留的IP。
注意: hosts字段把可能部署kubelet的主機ip都寫進去,只能寫ip地址,不能寫網段。后期如果在非hosts列表中ip主機上部署kubelet,需要重新簽發證書,並更換證書,並重啟服務
(2) 生成kube-apiserver證書和私鑰
# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes \
kube-apiserver-csr.json | cfssljson -bare kube-apiserver
# 生成以kube-apiserver開頭的文件kube-apiserver.csr、kube-apiserver-key.pem、kube-apiserver.pem
(3) 驗證kube-apiserver.pem證書
# cfssl certinfo -cert kube-apiserver.pem |grep not
# 可以看到kube-apiserver證書的有效期是10年,但是ca證書的有效期只有5年,所以kube-apiserver證書的
# 實際有效期也只有5年。
驗證網站: https://myssl.com/cert_decode.html
驗證信息如下:
3 生成kube-apiserver證書(100年)
# mkdir -p /root/k8s_tls_100/
# cd /root/k8s_tls_100/
生成CA默認配置文件和默認簽名請求文件的方法(使用時根據需要修改默認配置)
# cfssl print-defaults config > ca-config.json
# cfssl print-defaults csr > ca-csr.json
(1) cfssl的配置文件
# cat > ca-config.json << EOF
{
"signing": {
"default": {
"expiry": "876000h"
},
"profiles": {
"kubernetes": {
"expiry": "876000h",
"usages": [
"signing",
"key encipherment",
"server auth",
"client auth"
]
}
}
}
}
EOF
注:
1) ca-config.json # 可以定義多個profiles,分別指定不同的過期時間、使用場景等參數,后續在簽名
證書時使用某個profile參數配置服務證書的有效期。
2) signing # 表示該證書可用於簽名其它證書,生成的ca.pem證書中CA=TRUE。
3) server auth # 表示client可以用該CA對server提供的證書進行驗證。
4) client auth # 表示 server 可以用該CA對client提供的證書進行驗證。
(2) 自簽CA 證書簽名請求文件,添加配置ca證書的有效期,添加字段"CA":{"expiry":"876000h"},
# cat > ca-csr.json << EOF
{
"CA":{"expiry":"876000h"},
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
(3) 生成CA證書和私鑰
# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
注: 生成以ca開頭證書頒發機構(CA)的文件有ca.csr、ca-key.pem、ca.pem
(4) 驗證ca證書ca.pem
# cfssl certinfo -cert ca.pem |grep not
# 可以看到ca證書的有效期是100年。
驗證網站: https://myssl.com/cert_decode.html
驗證信息如下:
2 使用自簽CA簽發kube-apiserver HTTPS證書
(1) 創建kube-apiserver證書簽名請求文件(使用CN)
# cat > kube-apiserver-csr.json << EOF
{
"CN": "kube-apiserver",
"hosts": [
"k8s-master1",
"k8s-master2",
"127.0.0.1",
"172.16.1.81",
"10.0.0.81",
"172.16.1.82",
"10.0.0.82",
"172.16.1.80",
"172.28.0.1",
"kubernetes",
"kubernetes.default",
"kubernetes.default.svc",
"kubernetes.default.svc.cluster",
"kubernetes.default.svc.cluster.local"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "BeiJing",
"ST": "BeiJing",
"O": "k8s",
"OU": "System"
}
]
}
EOF
注:
CN # Common Name,kube-apiserver從證書中提取該字段作為請求的用戶名(User Name),瀏覽
器使用該字段驗證網站是否合法。RBAC,用於client auth,放到客戶端證書中。
O # Organization,kube-apiserver從證書中提取該字段作為請求用戶所屬的組(Group)。RBAC,
用於client auth,放到客戶端證書中。
# 上述文件hosts字段中指定授權使用該證書的IP或者域名列表,為所有Master/LB/VIP IP/apiserver
集群內部cluster ip(指定的service-cluster-ip-range 網段的第一個IP "${CLUSTER_KUBERNETES_SVC_IP}")一個都不能少,為了方便后期擴容可以多寫幾個預留的IP。
注意: hosts字段把可能部署kubelet的主機ip都寫進去,只能寫ip地址,不能寫網段。后期如果在非hosts列表中ip主機上部署kubelet,需要重新簽發證書,並更換證書,並重啟服務
(2) 生成kube-apiserver證書和私鑰
# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes \
kube-apiserver-csr.json | cfssljson -bare kube-apiserver
# 生成以kube-apiserver開頭的文件kube-apiserver.csr、kube-apiserver-key.pem、kube-apiserver.pem
(3) 驗證kube-apiserver.pem證書
# cfssl certinfo -cert kube-apiserver.pem |grep not
# 可以看到kube-apiserver證書的有效期是100年,又因為ca證書的有效期是100年,所以kube-apiserver證
# 書的實際有效期是100年。
驗證網站: https://myssl.com/cert_decode.html
驗證信息如下: