目錄
- 一、模擬創建CA證書(中間邊框的部分)
- 二、簽發服務器端證書(右邊藍色背景部分)
- 三、簽發客戶端證書(左邊黃色背景的部分)
- 四、簽發證書收尾工作
- 五、配置docker服務端
- 六、IDEA配置使用客戶端證書
前文中我們曾經介紹過《使用IDEA遠程工具》連接Docker REST API,我們會發現一個問題,任何知道Docker 服務器IP、端口的第三方都可以訪問這個API,非常的不安全。為了保證Docker API的安全性,我們有必要使用數字證書進行安全驗證。
- 為docker服務端配置服務端證書,用于驗證客戶端請求
- 為訪問docker 服務的客戶端配置客戶端證書,用于驗證服務端發送的交互信息的安全性。
如果只在自己公司內部使用到數字證書,就沒有必要花錢向專業的CA機構進行認證授權(價格不菲),采用自生成的CA證書在公司內部使用也是完全可以的。下圖是CA證書及子證書的簽發過程,請結合文章進行理解。
一、模擬創建CA證書(中間邊框的部分)
正常情況下CA機構有自己的私鑰,因為我們是模擬CA機構,所以這個私鑰需要我們自己創建。執行下文中的命令,輸入2次密碼(密碼務必記住,后文中需要使用),執行完命令之后,當前目錄下生成一個ca-key.pem
文件(上圖中紅色背景代表)。
# openssl genrsa -aes256 -out ca-key.pem 4096 Generating RSA private key, 4096 bit long modulus e is 65537 (0x10001) Enter pass phrase for ca-key.pem: Verifying - Enter pass phrase for ca-key.pem:
該命令用于創建機構CA證書,執行該命令首先會提示輸入密碼(上文中設置的)。正常請開給你下,該流程是某公司向CA提機構提交自己公司的相關信息,CA授權機構根據這些信息(審核信息之后)生成一個用于該公司的CA證書(該公司范圍的根證書)。
openssl req -new -x509 -days 3650 -key ca-key.pem -sha256 -out ca.pem
然后提示需要輸入國家、省份、地市、公司、組織、服務器地址或域名、郵箱聯系方式,其中國家和服務器地址或域名要填上,否則后續無法使用。
# 國家:CN Country Name (2 letter code) [XX]: CN # 省份: 可以不填,直接回車 State or Province Name (full name) []: # 地市:可以不填,直接回車 Locality Name (eg, city) [Default City]: # 公司: 可以不填,直接回車 Organization Name (eg, company) [Default Company Ltd]: # 組織: 可以不填,直接回車 Organizational Unit Name (eg, section) []: # 服務器地址或域名,按要求填寫 Common Name (eg, your name or your server's hostname) []: 192.168.1.111 # 郵箱聯系方式,可以不填,直接回車 Email Address []:
當前目錄下生成一個ca.pem
,該證書就是CA證書
二、簽發服務器端證書(右邊藍色背景部分)
CA證書還可以用于簽發子證書(數字證書),下面我們就模擬簽發一個服務端證書。仍然需要先創建一個服務器端私鑰server-key.pem
openssl genrsa -out server-key.pem 4096
創建服務器端CSRserver.csr
,該文件作為向授權機構申請簽發子證書的申請文件
openssl req -subj "/CN=192.168.1.111" -sha256 -new -key server-key.pem -out server.csr
模擬授權機構創建配置文件,serverAuth
表示服務端證書
echo subjectAltName = IP:192.168.1.111,IP:0.0.0.0 >> extfile.cnf echo extendedKeyUsage = serverAuth >> extfile.cnf
創建服務器端證書會提示輸入密碼,輸入上文中設置的密碼即可。
openssl x509 -req -days 3650 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
生成2個文件ca.srl、server-cert.pem,我們需要的是server-cert.pem
作為服務端CA證書
三、簽發客戶端證書(左邊黃色背景的部分)
下面我們就模擬簽發一個客戶端證書。仍然需要先創建一個客戶端私鑰key.pem
openssl genrsa -out key.pem 4096
創建客戶端CSRclient.csr
,該文件作為向授權機構申請簽發子證書的申請文件
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
模擬授權機構創建配置文件,clientAuth
表示客戶端證書
echo extendedKeyUsage = clientAuth >> extfile.cnf
執行下列命令同樣會提示輸入密碼,生成2個文件ca.srl
、cert.pem
,我們需要的是cert.pem
作為客戶端證書
openssl x509 -req -days 3650 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
四、簽發證書收尾工作
刪除證書簽發請求文件,已經失去用處。
rm -v client.csr server.csr
為上文中生成的各種證書授予文件訪問權限。
chmod -v 0400 ca-key.pem key.pem server-key.pem; chmod -v 0444 ca.pem server-cert.pem cert.pem;
查看CA證書有效期
# openssl x509 -in ca.pem -noout -dates notBefore=Apr 10 01:17:55 2022 GMT notAfter=Apr 7 01:17:55 2032 GMT
五、配置docker服務端
然后我們為docker服務端配置證書,分別是ca.pem、server-cert.pem、server-key.pem。將這三個文件放入/etc/docker/cert/
目錄下。
mkdir /etc/docker/cert/; cp ./ca.pem ./server-cert.pem ./server-key.pem /etc/docker/cert/;
修改vim /lib/systemd/system/docker.service
文件中的ExecStart
這一行,修改為如下的一段
ExecStart=/usr/bin/dockerd --tlsverify --tlscacert=/etc/docker/cert/ca.pem --tlscert=/etc/docker/cert/server-cert.pem --tlskey=/etc/docker/cert/server-key.pem -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock
修改之后重啟docker服務
#重啟 systemctl daemon-reload && systemctl restart docker
六、IDEA配置使用客戶端證書
我們在IDEA docker插件客戶端證書配置處做如下選擇:“File -> Settings -> Build、Execution、Deployment -> Docker”
- Engine API URL的位置寫
https://<ip>:2375
,記住是https,不是http,也不是tcp - 將客戶端的需要的三個證書文件ca.pem、cert.pem、key.pem放入一個目錄下,并使選擇該目錄作為Certificates folder。