前言:Docker直接開啟2375埠是不安全的,別人只要連上之後就可以任意操作,下面是開啟Docker的TLS和CA認證方法,並使用Jenkins和Portainer連線。

一、生成證書

檢視伺服器主機名

hostname

auto-generate-docker-tls-ca.sh

# !/bin/bash

# 一鍵生成TLS和CA證書

# Create : 2021-08-25
# Update : 2021-08-25
# @Autor : wuduoqiang # 伺服器主機名
SERVER="6c377ffb8e86"
# 密碼
PASSWORD="2cx&BUjsV4u%3TW9"
# 國家
COUNTRY="CN"
# 省份
STATE="海南省"
# 城市
CITY="海口市"
# 機構名稱
ORGANIZATION="小強崽公司"
# 機構單位
ORGANIZATIONAL_UNIT="小強崽單位"
# 郵箱
EMAIL="[email protected]" # 生成CA金鑰
openssl genrsa -aes256 -passout pass:$PASSWORD -out ca-key.pem 2048 # 生成CA證書
openssl req -new -x509 -passin "pass:$PASSWORD" -days 3650 -key ca-key.pem -sha256 -out ca-cert.pem -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$SERVER/emailAddress=$EMAIL" # 生成服務端金鑰
openssl genrsa -out server-key.pem 2048 # 生成服務端證書籤名的請求檔案
openssl req -subj "/CN=$SERVER" -new -key server-key.pem -out server-req.csr # 生成服務端證書
openssl x509 -req -days 3650 -in server-req.csr -CA ca-cert.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out server-cert.pem # 生成客戶端金鑰
openssl genrsa -out client-key.pem 2048 # 生成客戶端證書籤名的請求檔案
openssl req -subj '/CN=client' -new -key client-key.pem -out client-req.csr # 生成客戶端證書
sh -c 'echo "extendedKeyUsage=clientAuth" >> extfile.cnf'
openssl x509 -req -days 3650 -in client-req.csr -CA ca-cert.pem -CAkey ca-key.pem -passin "pass:$PASSWORD" -CAcreateserial -out client-cert.pem -extfile extfile.cnf # 更改金鑰許可權
chmod 0400 ca-key.pem server-key.pem client-key.pem
# 更改證書許可權
chmod 0444 ca-cert.pem server-cert.pem client-cert.pem
# 刪除無用檔案
# rm ca-cert.srl client-req.csr server-req.csr extfile.cnf

檔案說明

ca.srl:CA簽發證書的序列號記錄檔案
ca-cert.pem:CA證書
ca-key.pem:CA金鑰
server-key.pem:服務端金鑰
server-req.csr:服務端證書籤名請求檔案
server-cert.pem:服務端證書
client-key.pem:客戶端金鑰
extfile.cnf:客戶端證書擴充套件配置檔案
client-req.csr:客戶端證書籤名請求檔案
client-cert.pem:客戶端證書

命令解析

# -subj /C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORGANIZATION/OU=$ORGANIZATIONAL_UNIT/CN=$SERVER/emailAddress=$EMAIL
-subj 是 指定證書申請人的資訊
C 是 Country Name
ST 是 State or Province Name
L 是 Locality Name
O 是 Organization Name
OU 是 Organizational Unit Name
CN 是 Common Name
emailAddress 是 Email Address

二、開啟遠端

開啟Docker的遠端訪問API

# 編輯檔案
vim /etc/systemd/system/docker.service
# 修改內容,注意證書的指定位置
ExecStart=/usr/bin/dockerd \
--tlsverify \
--tlscacert=/etc/docker/ca-cert.pem \
--tlscert=/etc/docker/server-cert.pem \
--tlskey=/etc/docker/server-key.pem \
-H unix:///var/run/docker.sock \
-H tcp://0.0.0.0:2375
# 重啟服務
systemctl daemon-reload && systemctl restart docker

如果沒有金鑰和證書是連不上的

docker -H 192.168.8.248:2375 images

使用主機名沒有金鑰和證書也是連不上的

docker -H 6c377ffb8e86:2375 images

加上金鑰和證書沒有使用主機名也是連不上

curl https://192.168.8.248:2375/info --cert ./client-cert.pem --key ./client-key.pem --cacert ./ca-cert.pem

加上金鑰和證書並且使用主機名就能訪問

curl https://6c377ffb8e86:2375/info --cert ./client-cert.pem --key ./client-key.pem --cacert ./ca-cert.pem

三、遠端連線

3.1 Jenkins連線

新增憑證

填寫資訊

測試連線,注意這裡要使用主機名

如果是docker安裝的jenkins,則需要對映主機名

version: '3'
services:
jenkins:
restart: always
image: 192.168.8.247/xiaoqiangzai/jenkins:latest
container_name: jenkins
ports:
- '8888:8080'
- '50000:50000'
volumes:
- ./data/jenkins_home:/var/jenkins_home
- ./data/war/jenkins.war:/usr/share/jenkins/jenkins.war
environment:
JENKINS_OPTS: "--prefix=/jenkins"
extra_hosts:
- "6c377ffb8e86:192.168.8.248"

3.2 Portainer連線

選擇客戶端金鑰和證書以及CA證書

連線正常

如果是docker安裝的Portainer,則需要對映主機名

version: '3'
services:
portainer:
restart: always
image: portainer/portainer-ce:latest
container_name: portainer
privileged: true
ports:
- '9000:9000'
volumes:
- ./data/data:/data
- ./data/public:/public
extra_hosts:
- "6c377ffb8e86:192.168.8.248"

作者(Author):小強崽

來源(Source):https://www.wuduoqiang.com/archives/Docker開啟TLS和CA認證

協議(License):署名-非商業性使用-相同方式共享 4.0 國際 (CC BY-NC-SA 4.0)

版權(Copyright):商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 For commercial use, please contact the author for authorization. For non-commercial use, please indicate the source.