配置Docker启用TLS,开启远程安全访问
# 推荐访问官方文档
https://docs.docker.com/engine/security/protect-access/
1
2
3
2
3
# 配置Docker启用TLS
# 1.首先,在Docker 守护进程的主机上,生成 CA 私钥和公钥:
openssl genrsa -aes256 -out ca-key.pem 4096
1
输入密码,确认密码

openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
1
依次输入密码、国家、省、市、组织名称等(除了密码外其他的可以直接回车跳过)

现在您有了 CA,您可以创建服务器密钥和证书签名请求 (CSR)。确保“Common Name”与您用来连接到 Docker 的主机名相匹配:
注意:
将以下示例所有实例中的 $HOST 替换为 服务器外网的IP或者域名
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
1
2
3
2
3
# 2.接下来,我们将使用我们的 CA 签署公钥:
注意:
由于可以通过 IP 地址和 DNS 名称建立 TLS 连接,因此在创建证书时需要指定 IP 地址。0.0.0.0表示所有ip都可以连接。(这里需要注意,虽然0.0.0.0可以匹配任意,但是仍需要配置你的外网ip和127.0.0.1,否则客户端会连接不上)
echo subjectAltName = IP:0.0.0.0,IP:10.10.10.20,IP:127.0.0.1 >> extfile.cnf
echo subjectAltName = DNS:$HOST,IP:10.10.10.20,IP:127.0.0.1 >> extfile.cnf
1
将 Docker 守护程序密钥的扩展使用属性设置为仅用于服务器身份验证:
echo extendedKeyUsage = serverAuth >> extfile.cnf
1
2
2
# 3.现在,生成签名证书:
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out server-cert.pem -extfile extfile.cnf
1
2
2

对于客户端身份验证,创建客户端密钥和证书签名请求:
openssl genrsa -out key.pem 4096
1
注意:
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
1
2
2
要使密钥适用于客户端身份验证,请创建一个新的扩展配置文件:
echo extendedKeyUsage = clientAuth > extfile-client.cnf
1
现在,生成签名证书:
openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out cert.pem -extfile extfile-client.cnf
1
2
2
cert.pem,server-cert.pem生成后您可以安全地删除两个证书签名请求和扩展配置文件:
rm -v client.csr server.csr extfile.cnf extfile-client.cnf
1
为保护您的密钥免受意外损坏,请删除其写入权限。要使它们只能由您读取,请按如下方式更改文件模式:
chmod -v 0400 ca-key.pem key.pem server-key.pem
1
证书可以是可读的,但您可能希望删除写入权限以防止意外损坏:
chmod -v 0444 ca.pem server-cert.pem cert.pem
1
# 4.修改docker配置文件
vim /usr/lib/systemd/system/docker.service
1
修改如下内容:
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/etc/docker/ca.pem
--tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H unix://var/run/docker.sock
1
2
2
重新加载docker配置后重启
systemctl daemon-reload
systemctl restart docker
1
2
3
2
3
netstat -nltp | grep 2376
1
# 5.idea配置

上次更新: 2022/12/06, 11:10:28