为Docker的socket配置TLS加密
发表于|更新于
|字数总计:668|阅读时长:3分钟|阅读量:
homepage的tree
配置完应该是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
   | . ├── config │   ├── bookmarks.yaml │   ├── custom.css │   ├── custom.js │   ├── docker.yaml │   ├── kubernetes.yaml │   ├── logs │   │   └── homepage.log │   ├── racknerd-tls │   │   ├── ca-key.pem │   │   ├── ca.pem │   │   ├── cert.pem │   │   ├── key.pem │   │   ├── server-cert.pem │   │   └── server-key.pem │   ├── services.yaml │   ├── settings.yaml │   └── widgets.yaml ├── data.yml ├── docker-compose.yml ├── icons │   └── ... └── images     └── ...
   | 
 
生成CA证书
1
   | openssl genrsa -aes256 -out ca-key.pem 4096
   | 
 
然后输入两次密钥,并确保密钥被记住。
1
   | openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
   | 
 
要求输入密钥以及CA机构的信息,可以随意填写(因为是个人CA)。
生成服务器密钥对
将下面的$HOST改为需要开放TLS端口的Docker宿主机的DNS名称(即解析到这个伺服器的域名)。
1 2
   | openssl genrsa -out server-key.pem 4096 openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
   | 
 
下面的10.10.10.20的IP可以按需求更改或删除。这个IP表示可以通过此IP访问装有Docker的伺服器(即IP证书)。
1 2
   | echo subjectAltName = DNS:$HOST,IP:10.10.10.20,IP:127.0.0.1 >> extfile.cnf echo extendedKeyUsage = serverAuth >> extfile.cnf
   | 
 
下面的365可以更改为需要的天数,表示这张证书从现在起的有效天数。需要输入CA证书的密码。
1
   | openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -extfile extfile.cnf
   | 
 
生成客户端密钥对
第四部步命令依旧需要输入CA证书密码。尽量更改有效日数与服务端有效日数相同。
1 2 3 4
   | openssl genrsa -out key.pem 4096 openssl req -subj '/CN=client' -new -key key.pem -out client.csr echo extendedKeyUsage = clientAuth > extfile-client.cnf 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
   | rm -v client.csr server.csr extfile.cnf extfile-client.cnf
   | 
 
为证书文件赋权
1 2
   | chmod -v 0400 ca-key.pem key.pem server-key.pem chmod -v 0444 ca.pem server-cert.pem cert.pem
   | 
 
服务端执行命令(临时运行)
1 2 3 4 5 6
   | dockerd \     --tlsverify \     --tlscacert=ca.pem \     --tlscert=server-cert.pem \     --tlskey=server-key.pem \     -H=0.0.0.0:2376
   | 
 
服务端执行命令(持久运行)
将 ca.pem, server-cert.pem, server-key.pem 上传到伺服器的 /etc/docker/ 目录中。
方法一:更改 Docker 启动配置文件
1
   | sudo nano /lib/systemd/system/docker.service
   | 
 
在 ExecStart 后增加参数:
1
   | --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem -H tcp://0.0.0.0:2376
   | 
 
方法二:更改 daemon.json 文件
这种方法需要删除 /lib/systemd/system/docker.service 中 ExecStart 后的参数 -H。
1
   | sudo nano /etc/docker/daemon.json
   | 
 
修改为:
1 2 3 4 5 6 7 8 9 10 11
   | {     "hosts": [         "fd://",         "unix:///var/run/docker.sock",         "tcp://0.0.0.0:2376"     ],     "tlsverify": true,     "tlscacert": "/etc/docker/ca.pem",     "tlscert": "/etc/docker/server-cert.pem",     "tlskey": "/etc/docker/server-key.pem" }
  | 
 
重启服务
1 2
   | sudo systemctl daemon-reload sudo systemctl restart docker
   |