Loading

cfssl ca 证书有效期修改

 

 

 

 

 

 

cfssl ca证书有效期修改

 

 

 

 

 

 

 

 

 

作者

刘畅

时间

2022-02-20

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

目录

1 准备cfssl证书生成工具

2 生成kube-apiserver证书(5)

3 生成kube-apiserver证书(100)

 


前言: 之前使用二进制方式部署的k8s高可用集群证书有限期为5(原因: ca证书默认有限期为5),时间有点短

,如果证书过期还要重新生成证书,比较麻烦,于是研究一下cfssl如何生成有限期较长的ca证书,比如效期为100

年,下面为验证过程。

1 准备cfssl证书生成工具

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

2 生成kube-apiserver证书(5)

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可以用该CAserver提供的证书进行验证。
4) client auth   # 
表示 server 可以用该CAclient提供的证书进行验证。

(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.csrca-key.pemca.pem

(4) 验证ca证书ca.pem
# cfssl certinfo -cert ca.pem |grep not
wps29CD.tmp
# 可以看到ca证书的有效期是5年。

验证网站: https://myssl.com/cert_decode.html
验证信息如下:
wps29DE.tmp

 

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 Namekube-apiserver从证书中提取该字段作为请求的用户名(User Name),浏览
器使用该字段验证网站是否合法。RBAC,用于client auth,放到客户端证书中。
O # Organizationkube-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.csrkube-apiserver-key.pemkube-apiserver.pem

(3) 验证kube-apiserver.pem证书
#
cfssl certinfo -cert kube-apiserver.pem |grep not
wps29DF.tmp
# 可以看到kube-apiserver证书的有效期是10年,但是ca证书的有效期只有5年,所以kube-apiserver证书的
# 
实际有效期也只有5年。

验证网站: https://myssl.com/cert_decode.html
验证信息如下:
wps29E0.tmp

 

 

3 生成kube-apiserver证书(100)

1 自签证书颁发机构(CA)

# 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可以用该CAserver提供的证书进行验证。
4) client auth     # 
表示 server 可以用该CAclient提供的证书进行验证

(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.csrca-key.pemca.pem

(4) 验证ca证书ca.pem
#
cfssl certinfo -cert ca.pem |grep not
wps29E1.tmp
# 可以看到ca证书的有效期是100年。

验证网站: https://myssl.com/cert_decode.html
验证信息如下:
wps29F1.tmp

 

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 Namekube-apiserver从证书中提取该字段作为请求的用户名(User Name),浏览
器使用该字段验证网站是否合法。RBAC,用于client auth,放到客户端证书中。
O # Organizationkube-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.csrkube-apiserver-key.pemkube-apiserver.pem

(3) 验证kube-apiserver.pem证书
# cfssl certinfo -cert kube-apiserver.pem |grep not
wps29F2.tmp
# 可以看到kube-apiserver证书的有效期是100年,又因为ca证书的有效期是100年,所以kube-apiserver
# 书的实际有效期是100
年。

验证网站: https://myssl.com/cert_decode.html
验证信息如下:
wps29F3.tmp

posted @ 2022-02-20 23:19  云起时。  阅读(520)  评论(0编辑  收藏  举报