在前文中我們是通過直接暴露端口進行 docker 的連接。但是這種做法存在安全隱患,因爲只要知道了服務器的 ip 地址以及端口號即可對 docker 進行肆意操作與破壞。所以實際項目中建議使用密鑰的方式做認證。
三、使用證書進行安全連接
1、創建證書
(1)首先選擇一個存放密鑰文件的地方(我這裏選擇 /home/user/certs),執行如下命令創建文件夾,並進入該文件夾:
mkdir /home/user/certs
cd /home/user/certs
(2)執行如下命令生成 CA 私鑰,過程中會要求輸入密碼(這裏我輸入 123456):
openssl genrsa -aes256 -out ca-key.pem 4096
(3)接着執行如下命令生成 CA 公鑰,也就是證書。一開始會要求輸入前面設置的密碼:
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
注意:過程中 Common Name 填寫服務器的 ip 地址。其它幾項就隨便填了。
(4)接着執行如下命令生成服務器私鑰:
openssl genrsa -out server-key.pem 4096
(5)接着執行如下命令用私鑰生成服務器公鑰請求文件,也就是證書:
注意:CN 後面的 IP 地址即爲前面我們設置的服務器 IP。
openssl req -subj "/CN=192.168.60.133" -sha256 -new -key server-key.pem -out server.csr
(6)接着執行如下配置哪些主機可以訪問 docker:
這裏我們可以填寫 IP 地址或者 DNS name。 0.0.0.0 代表所有主機都可以通過密鑰文件的方式訪問
echo subjectAltName = DNS:192.168.60.133,IP:192.168.60.133,IP:0.0.0.0,IP:127.0.0.1 >> extfile.cnf
(7)接着執行如下命令:
echo extendedKeyUsage = serverAuth >> extfile.cnf
(8)接着執行如下命令將上述多個生成信息,寫入文件(期間同樣會要求輸入密碼)。
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
(9)接着執行如下命令生成客戶端私鑰:
openssl genrsa -out key.pem 4096
(10)接着執行如下命令生成客戶端證書請求文件:
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
(11)接着執行如下命令:
echo extendedKeyUsage = clientAuth >> extfile.cnf
(12)接着執行如下命令用 CA 爲客戶端簽署證書文件(期間同樣會要求輸入密碼):
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnf
(13)執行如下命令刪除臨時文件 :
rm -v client.csr server.csr
(14)執行如下命令配置證書權限:
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0444 ca.pem server-cert.pem cert.pem
(15)查看 /home/user/certs 下的文件,一共應該有 8 個文件:
2、服務端設置
(1)首先執行如下命令編輯服務器上的 docker.service 文件。
vi /lib/systemd/system/docker.service
(2)找到 Execstart=/usr/bin/dockerd,並在後加上如下內容,然後保存退出。
-D --tlsverify=true --tlscert=/home/user/certs/server-cert.pem --tlskey=/home/user/certs/server-key.pem --tlscacert=/home/user/certs/ca.pem -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock
(3)接着運行以下命令,重啓 docker 服務。
systemctl daemon-reload
service docker restart//重啓啓動docker
(4)執行如下命令可以查看相關內容,看看設置是否生效:
systemctl status docker
3、客戶端設置
(1)首先將 ca-key.pem、ca.pem、cert.pem、key.pem 這 4 個密鑰文件下載到本機的磁盤上,這裏我將其放在 /Users/hangge/dockerCerts 目錄下。
(2)然後 Java 這邊,使用證書進行安全連接即可。下面代碼在連接 docker 服務器後,獲取相關信息並打印出來。
@RestController
public class HelloController {
@RequestMapping("/test")
public String test() {
//進行安全認證
DockerClientConfig config = DefaultDockerClientConfig.createDefaultConfigBuilder()
.withDockerTlsVerify(true)
.withDockerCertPath("/Users/hangge/dockerCerts/")
.withDockerHost("tcp://192.168.60.133:2375")
.withDockerConfig("/Users/hangge/dockerCerts/")
.build();
// 連接docker服務器
DockerClient dockerClient = DockerClientBuilder.getInstance(config).build();
// 獲取服務器信息
Info info = dockerClient.infoCmd().exec();
String infoStr = JSONObject.toJSONString(info);
System.out.println(infoStr);
return infoStr;
}
}
(3)運行結果如下: