DDC系列 - 设置CA证书

1 名词说明

  • DDC:Docker Data Center,Docker数据中心管理系统;
  • UCP: Universal Control Plane,通用控制面板;
  • DTR: Docker Trusted Registry,Docker镜像注册表;
  • CSR: Certificate Signing Request,即证书签名请求, 这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥;
  • PEM: X.509证书的一种编码格式,内容以"-----BEGIN"开头,以"-----END"结尾,内容是BASE64编码;
  • 服务器: 这里是指安装UCP/DTR的主机,或者作为Docker Remote API场景中被访问的服务器端主机,本文中UCP服务器IP为192.168.1.101,DTR服务器IP为192.168.1.102;
  • 客户端: 这里是指需要访问UCP/DTR的主机,或者作为Docker Remote API场景中发起访问请求的客户端主机,本文中客户端IP为192.168.1.103, 192.168.1.104。

2 生成证书

2.1 通过SSH登录到服务器主机。

2.2 生成CA私钥

CA私钥文件名:ca-key.pem

$ mkdir -p /home/ca && cd /home/ca
$ openssl genrsa -out ca-key.pem 4096

2.3 生成自签名CA证书

CA证书文件名:ca.pem

需要用到步骤2.2生成的CA私钥。

$ openssl req -x509 -sha256 -batch -subj '/C=CN/ST=Beijing/L=Beijing/O=COMPANY/OU=PBG/CN=www.yourdomain.com' -new -days 365 -key ca-key.pem -out ca.pem

生成证书时,通过-days 365设置证书的有效期。单位为天,默认情况下为30天。

参数说明:

  • C 表示国家,中国为CN
  • ST 表示省,比如Beijing
  • L 表示城市,比如Beijing
  • O 表示公司,比如COMPANY
  • OU 表示部门名字,比如RD
  • CN 表示公司域名,比如www.yourdomain.com

2.4 生成服务器私钥

服务器私钥文件名: server-key.pem

$ openssl genrsa -out server-key.pem 4096

2.5 生成服务器证书签名请求

服务器证书签名请求文件名: server.csr

需要用到步骤2.4生成的服务器私钥。

$ openssl req -subj '/CN=<yourdomain.com>' -sha256 -new -key server-key.pem -out server.csr

CN为UCP(DTR)所在主机名或FQDN。
server.csr是一个临时文件,生成server-cert.pem以后,可以删除。

2.6 生成服务器证书

服务器证书文件名:server-cert.pem

需要用到的文件:
步骤2.2生成的CA私钥;
步骤2.3生成的CA证书;
步骤2.5生成的服务器证书签名请求。

$ echo subjectAltName = DNS:ucp.yourdomain.com,IP:0.0.0.0 > 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

subjectAltName参数限制客户端的IP列表或者域名列表。只有在列表中的客户端才能通过客户端证书访问UCP主机上的Docker Daemon。
例如192.168.1.103, 192.168.1.104,则只允许这2个客户端上docker client访问。如果添加0.0.0.0,则所有客户端都可以通过证书访问。
extfile.cnf是一个临时文件,生成server-cert.pem以后,可以删除。

2.7 生成客户端密钥

客户端私钥文件名: client-key.pem

$ openssl genrsa -out client-key.pem 4096

2.8 生成客户端证书签名请求

客户端证书签名请求文件名: client.csr

需要用到步骤2.7生成的客户端私钥。

$ openssl genrsa -out client-key.pem 4096
$ openssl req -subj '/CN=client' -new -key client-key.pem -out client.csr

client.csr是一个临时文件,生成server-cert.pem以后,可以删除。

2.9 生成客户端证书

客户端证书文件名:client-cert.pem

需要用到的文件:
步骤2.2生成的CA私钥;
步骤2.3生成的CA证书;
步骤2.5生成的客户端证书签名请求。

$ subjectAltName = DNS:192.168.1.101,IP:192.168.1.103,IP:192.168.1.104
$ echo extendedKeyUsage = clientAuth > extfile.cnf

$ openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -extfile extfile.cnf

3 清理工作

3.1 删除临时文件

$ rm -v client.csr server-csr

3.2 删除写入权限

$ chmod -v 0400 ca-key.pem client-key.pem server-key.pem
$ chmod -v 0444 ca.pem server-cert.pem client-cert.pem

4 使用CA

4.1 UCP设置自定义CA证书

在UCP Web UI中, 导航到管理员设置页面,在左侧菜单中,单击证书

依次上传:

  • 私钥:server-key.pem
  • 服务器证书:server-cert.pem
  • CA证书:ca.pem

点击保存

4.2 DTR设置自定义CA证书

在DTR Web UI中,导航到系统页面, 在右侧页面中,点击常规,定位到域和代理,点击显示TLS设置

依次上传:

  • 私钥:server-key.pem
  • 服务器证书:server-cert.pem
  • CA证书:ca.pem

点击保存

4.3 Docker Remote API安全配置

a, 在服务器上配置docker守护进程
$ dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem -H=0.0.0.0:2375

重启docker后,步骤2.6中未授权的客户端将无法远程访问服务器上的Docker API。

例如,在未授权的客户端执行如下命令将报权限错误:

$ docker -H tcp://192.168.1.101:2375 version
b, 在客户端上配置docker服务

复制ca.pem, client-cert.pem, client-key.pem三个文件到客户端主机上,然后在客户端主机上执行如下命令:

$ docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H=192.168.1.101:2375 version

可以正常访问服务器上的Docker Remote API。

如果不希望每次执行命令都带上这么多参数

可以把 ca.pem,cert.pem,key.pem三个文件移动到本地目录:~/.docker,然后设置环境变量:

$ export DOCKER_HOST=tcp://$HOST:2375 DOCKER_TLS_VERIFY=1

执行如下命令访问服务器上的Docker Remote API。

$ docker -H=192.168.1.101:2375 version

系列文章

DDC系列 - UCP安装指南
DDC系列 - DTR安装指南
DDC系列 - 离线安装UCP和DTR
DDC系列 - 设置CA证书




你现在的气质里,藏着你走过的路,读过的书,爱过的人。


上一篇:四大家族垄断的工业机器人市场,传统工业如何突出重围?


下一篇:微软证实云计算平台暂时中断 显现安全弊端