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证书
你现在的气质里,藏着你走过的路,读过的书,爱过的人。