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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM