對于網站類的應用,網站管理員需要向權威證書簽發機構(CA)申請證書,這通常需要花費一定的費用,也有非營利的證書簽發機構,比如”Let’s Encrypt“可以為用戶免費簽發證書。但對于Kubernetes
這類應用來講,它通常部署在企業內部,其管理面組件不需要暴露到公網,所以就不需要向外部的證書簽發機構申請證書,系統管理員就可以自已簽發證書供內部使用。
本節我們使用簡單的例子,介紹一下如何使用openssl
簽發證書,側重介紹簽發證書流程,具體證書配置還需要管理員根據實際情況填寫。
以kube-apiserver
為例,它的啟動參數有3處需要配置證書:
--client-ca-file=/yourdirectory/ca.crt --tls-cert-file=/yourdirectory/server.crt --tls-private-key-file=/yourdirectory/server.key
其中ca.crt
即CA的證書,通常Kubernetes各個組件都配置相同的CA證書,server.crt
即kube-apiserver
的證書,它將在與客戶端建立連接時發送給客戶端,由客戶端進行驗證,server.key
即kube-apiserver
的私鑰,它不會發送給客戶端,僅用于解密客戶端發送的數據。
為了便于理解,我們假設有兩位管理員參與證書簽發流程,一位CA管理員負責管理CA的憑證并為他人提供簽發證書的服務,一位管理員負責為kube-apiserver
申請證書。
CA憑證包括一個私鑰和證書,私鑰由CA機構保存,不會對外公開,證書則是對外公開的。生成證書前面要先為CA機構創建一個私鑰。
使用openssl genrsa
命令便可以生成一個私鑰:
# openssl genrsa -out ca.key 2048 Generating RSA private key, 2048 bit long modulus .....................................................................+++ ........................................+++ e is 65537 (0x10001)
生成的私鑰存在ca.key
文件中,可以使用cat
命令查看:
# ls ca.key # cat ca.key -----BEGIN RSA PRIVATE KEY----- MIIEog...// 省略若干內容 -----END RSA PRIVATE KEY-----
接著使用openssl req
命令生成一個證書:
# openssl req -x509 -new -nodes -key ca.key -subj "/CN=ca" -days 10000 -out ca.crt
生成的證書存在ca.crt
文件中,可以使用openssl x509
命令查看:
# openssl x509 -in ca.crt -text -noout Certificate: Data: Version: 3 (0x2) ...
到此為止,CA管理員已經擁有了一個私鑰和證書,可以為kube-apiserver
簽發證書了。
要申請證書,kube-apiserver
管理員需要準備一個證書簽發請求(申請書),為此,kube-apiserver
管理員需要先為kube-apiserver
生成一個私鑰。
為kube-apiserver
生成私鑰與前面為CA生成私鑰的方法完全一致,同樣可以使用openssl genrsa
完成:
# openssl genrsa -out server.key 2048
生成的私鑰存放于server.key
中。
接著kube-apiserver
管理員需要使用kube-apiserver
的私鑰生成一個證書簽發請求,才可以提交給CA管理員進行簽發。
使用openssl req -new
命令可以創建一個證書請求文件:
# openssl req -new -key server.key -out server.csr
創建證書請求文件需要提供私鑰,然后根據命令行提示輸入相關信息,生成的請求文件存放于server.csr
文件中。
當kube-apiserver
管理員創建好證書請求文件后,即可提次給CA管理員進行證書簽發了。CA管理員在簽發時
需要使用CA的私鑰和證書:
# openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 10000 Signature ok
這樣簽發完的證書就會保存在server.crt
文件中。
關于證書及私鑰文件,常常會使用約定俗成的文件名后綴。
*.key: 往往表示私鑰文件;
*.crt: certificate的縮寫,往往表示證書文件;
此外,*.csr
文件為證書簽名請求文件,“Certificate Signing Request”的縮寫,該文件內含公鑰及公鑰所屬者信息,用于向CA機構申請簽名。
《Self-signed_certificate》by Wikipedia: https://en.wikipedia.org/wiki/Self-signed_certificate
《Certificates》by k8s.io: https://kubernetes.io/docs/concepts/cluster-administration/certificates/