Cfssl生成etcd自簽證書(pem)
CFSSL是CloudFlare開源的一款PKI/TLS工具,CFSSL包含一個命令列工具和一個用於簽名,驗證並且捆綁TLS證書的HTTP API服務,環境構建方面需要 Go 1.12+。
需要兩套證書,一套k8s通訊使用,一套etcd內部通訊使用
安裝一些實用的命令列工具,其中包括 cfssl、cfssljson。
cfssljson 程式,從 cfssl 獲取 JSON 輸出,並將證書、金鑰、CSR和 bundle 寫入指定位置。
環境配置
HostName | ip | etcd內部通訊埠 |外部通訊埠
infra0 | 192.168.1.106 | 2379 | 2380 |
infra1 | 192.168.1.108 | 2379 | 2380 |
infra2 | 192.168.1.109 | 2379 | 2380 |
=====================以下在操作在mstart 上執行=====================
一、下載證書生成工具
https://github.com/cloudflare/cfssl/releases/download/1.2.0/cfssl_linux-amd64 https://github.com/cloudflare/cfssl/releases/download/1.2.0/cfssljson_linux-amd64 https://github.com/cloudflare/cfssl/releases/download/1.2.0/cfssl-certinfo_linux-amd64
注:下載慢,可以使用第三方工具,迅雷下載,然後上傳至伺服器!
1、給所有工具設定執行許可權
yang@master:~$ sudo chmod +x cfssl* yang@master:~$ ls cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64
2、生成預設CA配置json配置檔案
yang@master:~$ sudo cfssl print-defaults config > ca-config.json yang@master:~$ sudo cfssl print-defaults csr > ca-csr.json yang@master:~$ ls ca-config.json ca-csr.json cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64
A、ca-config.json檔案內容:
{ "signing": { "default": { "expiry": "168h" }, "profiles": { "www": { "expiry": "8760h", "usages": [ "signing", "key encipherment", "server auth" ] }, "client": { "expiry": "8760h", "usages": [ "signing", "key encipherment", "client auth" ] } } } }
B、ca-csr.json檔案內容:
{ "CN": "example.net", "hosts": [ "example.net", "www.example.net" ], "key": { "algo": "ecdsa", "size": 256 }, "names": [ { "C": "US", "L": "CA", "ST": "San Francisco" } ] }
3、生成CA證書
A、首先修改ca-config.json檔案內容:
yang@master:~$ cat ca-config.json { "signing":{ "default":{ "expiry":"876000h" }, "profiles":{ "kubernetes":{ "usages":[ "signing", "key encipherment", "server auth", "client auth" ], "expiry":"876000h" } } } }
欄位說明:
ca-config.json:可以定義多個 profiles,分別指定不同的過期時間、使用場景等引數;後續在簽名證書時使用某個 profile;
signing:表示該證書可用於簽名其它證書;生成的 ca.pem 證書中 CA=TRUE;
server auth:表示client可以用該 CA 對server提供的證書進行驗證;
client auth:表示server可以用該CA對client提供的證書進行驗證;
B、修改ca-csr.json檔案內容:
yang@master:~$ cat ca-csr.json { "CN": "CA", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "xian", "L": "shanxi", "O": "Kubernetes", "OU": "System" } ] }
"CN":Common Name,etcd 從證書中提取該欄位作為請求的使用者名稱 (User Name);瀏覽器使用該欄位驗證網站是否合法;
"O":Organization,etcd 從證書中提取該欄位作為請求使用者所屬的組 (Group);
這兩個引數在後面的kubernetes啟用RBAC模式中很重要,因為需要設定kubelet、admin等角色許可權,那麼在配置證書的時候就必須配置對了。
C、生產CA證書和私鑰
命令:cfssl gencert -initca ca-csr.json | cfssljson -bare ca
yang@master:~$ cfssl gencert -initca ca-csr.json | cfssljson -bare ca 2021/12/15 02:29:56 [INFO] generating a new CA key and certificate from CSR 2021/12/15 02:29:56 [INFO] generate received request 2021/12/15 02:29:56 [INFO] received CSR 2021/12/15 02:29:56 [INFO] generating key: rsa-2048 2021/12/15 02:29:56 [INFO] encoded CSR 2021/12/15 02:29:56 [INFO] signed certificate with serial number 297280955480032641265224573714844144324135690602
D 、檢視生產證書檔案
yang@master:~$ ls ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem cfssl-certinfo_linux-amd64 cfssljson_linux-amd64 cfssl_linux-amd64
說明:
根證書檔案: ca.pem
根證書私鑰: ca-key.pem
根證書申請檔案: ca.csr (csr是不是client ssl request?)
4、建立 etcd證書籤名請求(etcd-csr.json)
yang@master:~$ sudo nano etcd-csr.json { "CN": "etcd", "hosts": [ "127.0.0.1", "192.168.1.106", "192.168.1.108", "192.168.1.109" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "xian", "L": "shanxi", "O": "k8s", "OU": "System" } ] }
說明:
如果 hosts 欄位不為空則需要指定授權使用該證書的 IP 或域名列表,由於該證書後續被 etcd 叢集使用,所以填寫IP即可。 因為本次部署etcd是三臺,那麼則需要填寫三臺伺服器的IP地址。
5、使用ca證書籤發etcd證書
yang@master:~$ sudo cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes etcd-csr.json | cfssljson -bare etcd 2021/12/15 02:30:47 [INFO] generate received request 2021/12/15 02:30:47 [INFO] received CSR 2021/12/15 02:30:47 [INFO] generating key: rsa-2048 2021/12/15 02:30:47 [INFO] encoded CSR 2021/12/15 02:30:47 [INFO] signed certificate with serial number 655402234356318897903430018951458950558238874375
A、檢視生成的etcd證書
yang@master:~$ ls ca-config.json ca-csr.json ca.pem cfssljson_linux-amd64 etcd.csr etcd-key.pem ca.csr ca-key.pem cfssl-certinfo_linux-amd64 cfssl_linux-amd64 etcd-csr.json etcd.pem
注:可以看出多了etcd.csr、etcd-key.pem、etcd.pem
B、將TLS 認證檔案拷貝至證書目錄下(三臺機器都拷貝)
yang@master:~$ sudo cp etcd*.pem ca*.pem /opt/kubernetes/ssl/ yang@master:/opt/kubernetes/ssl$ ls ca-key.pem ca.pem etcd-key.pem etcd.pem
此時,etcd證書生成完成!