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.serviceExecStart 后的参数 -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