SpringBoot - 使用docker-java遠程管理docker教程2(使用證書進行安全連接)

 在前文中我們是通過直接暴露端口進行 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)運行結果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章