证书
1.证书分为根证书、中间证书、终端用户证书。根证书和中间证书都可以签发终端用户证书,也就是CA证书。
2.服务器证书和客户端证书,服务器证书一般用于客户端验证服务端是否可信(客户端使用预置的权威CA机构证书去验证服务器证书是否是权威CA签发)。客户端证书用于双向认证时,客户端将客户端证书(由服务端证书签发)发给服务端,验证客户端是否可信。
使用openssl生成CA证书并签发服务器证书
1.生成CA证书私钥
openssl genrsa -aes256 -out ca-key.pem 4096
2.使用私钥生成CSR(certificate signing request),保证Common Name是运行dockerd的主机域名。
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
3.创建服务端私钥和CSR(certificate signing request),$HOST替换成运行dockerd主机的域名。
openssl genrsa -out server-key.pem 4096
openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
4.添加允许连接dockerd的主机ip或者域名(如果是远程主机添加外部ip), 设置dockerd的extendedKeyUsage 只能用于服务器验证。
echo subjectAltName = DNS:$HOST,IP:10.10.10.20,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
5.用CA签发服务器证书
openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \
-CAcreateserial -out server-cert.pem
6.创建客户端私钥和CSR(certificate signing request)
openssl genrsa -out key.pem 4096
openssl req -subj '/CN=client' -new -key key.pem -out client.csr
7.用CA签发客户端证书
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
8.修改私钥文件和证书文件权限
chmod -v 0400 ca-key.pem key.pem server-key.pem
chmod -v 0400 ca-key.pem key.pem server-key.pem
9.设置dockerd启动命令只允许提供了被CA信任的证书的客户端连接。需要修改/lib/systemd/system/docker.service文件。
dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem \
-H=0.0.0.0:2376
10.客户端连接命令指定CA证书,客户端证书,客户端私钥(Docker over TLS should run on TCP port 2376.)。
docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem \
-H=$HOST:2376 version