默认情况下,Docker 通过监听本地的 unix socket 运行,同时还可以通过 TCP 进行通信,方便对 Docker 集群 管理。Docker 官方提供了通过 TLS 加密,来保证只有信任的客户端才能远程访问 Docker 服务。
采用私有 CA 签名证书。客户端只能够连接到该 CA 签名的证书和服务器。
使用 OpenSSL 创建 CA 、server 和 client
使用过程中涉及到三个方面
- 创建私有 CA 证书
- 使用 CA 证书对 Server 证书签名
- 使用 CA 证书对 client 证书签名
生成 CA 公钥和私钥。
1 2 3 4 5 6
| // 1. 生成 ca key 需要设置一个密码 # openssl genrsa -aes256 -out ca-key.pem 4096
// 2. 创建 ca 公钥 # openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
|
创建 Server 端证书
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| //创建 server key # openssl genrsa -out server-key.pem 4096
//证书签名请求文件 /CN后的填使用正式的ip或者域名 # openssl req -subj "/CN=192.168.1.123" -sha256 -new -key server-key.pem -out server.csr
//使用 CA 证书签名文件
// extfile.cnf IP:XXXX 允许访问的ip # echo subjectAltName = DNS:$HOST,IP:10.10.10.20,IP:127.0.0.1 >> extfile.cnf # echo extendedKeyUsage = serverAuth >> extfile.cnf
//生成签名证书 # openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
|
创建 client 证书
1 2 3 4 5 6 7 8
| // 客户端证书 # openssl genrsa -out key.pem 4096 // 客户端签名请求文件 # openssl req -subj '/CN=client' -new -key key.pem -out client.csr # echo extendedKeyUsage = clientAuth > extfile-client.cnf // CA 签名 # openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf
|
server 端配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| //1. 停止 docker 服务 $ service docker stop
//2.1 修改文件/etc/default/docker 添加变量 Docker_OPTS # Use DOCKER_OPTS to modify the daemon startup options. #DOCKER_OPTS="" DOCKER_OPTS=" -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock --tls --tlscacert /root/.docker/openssl/ca.pem --tlscert /root/.docker/openssl/server-cert.pem --tlskey /root/.docker/openssl/server-key.pem"
// 2.2 修改文件: /lib/systemd/system/docker.service 添加变量 $DOCKER_OPTS # #
EnvironmentFile=/etc/default/docker ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_OPTS
// 重启 docker 服务 $ service docker start
|
Client 端访问
$HOST 为服务端地址
1 2 3
| $ docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem \ -H=$HOST:2375 version
|
portainer 添加 Endpoint
官方文档
https://docs.docker.com/engine/security/https/