cfssl ca 证书有效期修改
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
验证信息如下: