OpenSSL
OpenSSL 是一個開源的軟件庫,里面包含了SSL協(xié)議庫、應(yīng)用程序以及密碼算法庫。通過這個工具我們可以實現(xiàn)自簽名證書,也可以更好的了解證書生成的過程。
1. OpenSSL 使用
1.1 安裝環(huán)境
Linux 系統(tǒng)一般自帶 OpenSSL 工具:
[root@instance-fk6xgagd ~]# openssl version
OpenSSL 1.0.2k-fips 26 Jan 2017
Window 環(huán)境到官網(wǎng)下載 exe 應(yīng)用工具,并將 exe 應(yīng)用配置到系統(tǒng)環(huán)境變量 Path 路徑中即可。
1.2 命令
OpenSSL 的命令可以分為以下3類
- Standard commands :一些標準的工具集合(ca證書工具等);
- Message Digest commands: 摘要生成的命令工具(哈希算法等);
- Cipher commands :加密工具(對稱非對稱算法等)。
[root@instance-fk6xgagd ~]# openssl help
openssl:Error: 'help' is an invalid command.
Standard commands
asn1parse ca ciphers cms
crl crl2pkcs7 dgst dh
dhparam dsa dsaparam ec
ecparam enc engine errstr
gendh gendsa genpkey genrsa
nseq ocsp passwd pkcs12
pkcs7 pkcs8 pkey pkeyparam
pkeyutl prime rand req
rsa rsautl s_client s_server
s_time sess_id smime speed
spkac ts verify version
x509
Message Digest commands (see the `dgst' command for more details)
md2 md4 md5 rmd160
sha sha1
Cipher commands (see the `enc' command for more details)
aes-128-cbc aes-128-ecb aes-192-cbc aes-192-ecb
aes-256-cbc aes-256-ecb base64 bf
bf-cbc bf-cfb bf-ecb bf-ofb
camellia-128-cbc camellia-128-ecb camellia-192-cbc camellia-192-ecb
camellia-256-cbc camellia-256-ecb cast cast-cbc
cast5-cbc cast5-cfb cast5-ecb cast5-ofb
des des-cbc des-cfb des-ecb
des-ede des-ede-cbc des-ede-cfb des-ede-ofb
des-ede3 des-ede3-cbc des-ede3-cfb des-ede3-ofb
des-ofb des3 desx idea
idea-cbc idea-cfb idea-ecb idea-ofb
rc2 rc2-40-cbc rc2-64-cbc rc2-cbc
rc2-cfb rc2-ecb rc2-ofb rc4
rc4-40 rc5 rc5-cbc rc5-cfb
rc5-ecb rc5-ofb seed seed-cbc
seed-cfb seed-ecb seed-ofb zlib
2. TLS服務(wù)認證案例
Kubernets 是一個開源的容器編排工具,它內(nèi)部包含了多個職能組件。Kubernetes 提供了基于 CA 簽名的雙向認證和基于 HTTP BASE 或 TOKEN 的認證方式,其中 CA 是安全性最高的一種。(不了解 Kubernetes 的把他想成一個多組件服務(wù)的系統(tǒng)即可)
Kubernetes 有上圖那么多組件,具體每個組件的用途我們這里不用去了解,其中 ApiServer 是一個核心服務(wù)。
圖中服務(wù)需要的證書:
- Kube-APIserver對外提供服務(wù),要有一套 kube-apiserver server 證書;
- kube-scheduler、kube-controller-manager、kube-proxy、kubelet;和其他可能用到的組件,需要訪問 kube-APIserver,要有一套 kube-APIserver client 證書;
- kube-controller-manager 要生成服務(wù)的 service account,要有一對用來簽署 service account 的證書(CA證書);
- kubelet 對外提供服務(wù),要有一套 kubelet server 證書;
- kube-APIserver 需要訪問 kubelet,要有一套 kubelet client 證書;
2.1 基于CA 的雙向數(shù)字證書認證
各個服務(wù)都需要雙向認證,所以每個服務(wù)都需要有自己的證書,證書是需要向 CA 申請的,所以我們要先制作 CA 根證書。
CA 證書的生成
先生成根證書,這個根證書后續(xù)將用于為每個組件生成屬于他們的證書。
- 先生成 CA 私鑰,長度為 2048。
# openssl genrsa -out ca.key 2048
- 用私鑰直接生成 CA 的根證書,證書的版本是 x509,過期時間 5000 天,使用者信息用的是主機名
/CN=k8s-master
openssl req -x509 -new -nodes -key ca.key -sub "/CN=k8s-master" -days 5000 -out ca.crt
ApiServer 證書生成
- 生成長度為 2048 的私鑰
openssl genrsa -out server.key 2048
- 通過配置文件創(chuàng)建 csr(證書請求文件)
openssl req -new -key server.key -sub "/CN=k8s-master" -config master_ssl.cnf -out server.csr
其中 master_ssl.cnf 文件主要包含了請求主體的一些基礎(chǔ)信息,這邊主要是服務(wù)器所在節(jié)點的主機名,IP 地址。這些信息后面也會生成到證書里面,像 IP 地址后續(xù)也可以作為校驗使用。
- 通過 csr 文件生成最終的 crt 證書:
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 5000 -extensions v3_req -extfile master_ssl.cnf -out server.crt
生成證書的時候都需要借助 CA ,CA用自己的私鑰簽名生成證書,把公鑰開放出去,供驗證者使用。
到此,我們已經(jīng)總的已經(jīng)生成了 5 個文件,回顧下它們的作用:
- ca.key:為了生成 CA 根證書;
- ca.crt:根證書,為了給后續(xù)的其它組件服務(wù)頒發(fā)證書用的;
- server.key:為了生成 apiServer 證書;
- server.csr:為了生成證書請求文件(這邊沒有直接通過私鑰生成證書,而是多了一個 CSR 的環(huán)節(jié));
- server.crt:最終 apiServer 的證書。
ApiServer 啟動的時候有下面 3 個核心參數(shù):
- 提供 TLS 安全服務(wù)所需的證書(讓別人驗證自己的);
tls-cert-file :apiServer 自己的證書文件;
tls-private-key-file :apiServer 的私鑰; - apiServer 提供給很多客戶端用,每個客戶端都需要自己的證書,這邊指定了根證書,客戶端必須是從該證書申請的才認可;
client-ca-file string :CA 根證書。
某個訪問 apiServer 客戶端證書的生成
openssl genrsa -out cs_client.key 2048
openssl req -new -key cs_client.key -sub "/CN=k8s-master" -out cs_client.csr
openssl x509 -req -in cs_client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 5000 -extensions v3_req -extfile master_ssl.cnf -out cs_client.crt
依然是生成自己的私鑰,證書請求CSR文件,后面生成最終的證書需要借助上面的 CA 私鑰 和 CA 根證書。
這邊一個組件的雙向證書都生成了,其它組件就不一一舉例。
3. 小結(jié)
TLS 的整個認證還是比較復(fù)雜的,OpenSSL 幫我們封裝了很多內(nèi)置算法,即便這樣這個過程下來流程還是比較多,需要我們抽絲剝繭慢慢了解。