第一步:设置静态IP和DNS (后面生成证书时需要用到)

设置IP和DNS主要在下面的配置文件中修改:

$ vi /etc/sysconfig/network-scripts/ifcfg-*

具体的配置文件需要到network-scripts目录下看,通常是以ifcfg-开头的,比如ifcfg-eth0,我的是ifcfg-ens33,另一个ifcfg-lo就是LOOPBACK网络咯。

$ vi /etc/sysconfig/network-scripts/ifcfg-[tab两下]
ifcfg-ens33  ifcfg-lo

1) 编辑ifcfg-ens33:

BOOTPROTO=static #dhcp改为static(修改)
ONBOOT=yes #开机启用本配置,一般在最后一行(修改)

IPADDR=192.168.1.204 #静态IP(增加)
GATEWAY=192.168.1.2 #默认网关,虚拟机安装的话,通常是2,也就是VMnet8的网关设置(增加)
NETMASK=255.255.255.0 #子网掩码(增加)
DNS1=192.168.1.2 #DNS 配置,虚拟机安装的话,DNS就网关就行,多个DNS网址的话再增加(增加)

2) 重启网络服务 或 开机重启

$ service network restart

3) 检查网络

可以看到,ens33这个网络就起来了。 

随便找个域名ping一下测试DNS是否OK:

$ ping www.baidu.com

第二步:使用OpenSSL创建CA,服务器和客户端密钥

注意:为了简化下一步,您可以在Docker守护程序的主机上执行此步骤。

首先,在Docker守护程序的主机上,生成CA私钥和公钥:


$ openssl genrsa -aes256 -out ca-key.pem 4096

Generating RSA private key, 4096 bit long modulus
............................................................................................................................................................................................++
........++
e is 65537 (0x10001)
Enter pass phrase for ca-key.pem:
Verifying - Enter pass phrase for ca-key.pem:

$ openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
Enter pass phrase for ca-key.pem:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:Queensland
Locality Name (eg, city) []:Brisbane
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Docker Inc
Organizational Unit Name (eg, section) []:Sales
Common Name (e.g. server FQDN or YOUR name) []:$HOST
Email Address []:Sven@home.org.a


现在您已拥有CA,您可以创建服务器密钥和证书签名请求(CSR)。

$ openssl genrsa -out server-key.pem 4096

Generating RSA private key, 4096 bit long modulus
.....................................................................++
.................................................................................................++
e is 65537 (0x10001)

$ openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr


接下来,我们将使用我们的CA签署公钥:

由于可以通过IP地址和DNS名称建立TLS连接,因此在创建证书时需要指定IP地址。例如,允许使用10.10.10.20 和 连接127.0.0.1:

$ echo subjectAltName = DNS:$HOST,IP:10.10.10.20,IP:127.0.0.1 >> extfile.cnf

将Docker守护程序密钥的扩展使用属性设置为仅用于服务器身份验证:

$ 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
Signature ok
subject=/CN=your.host.com
Getting CA Private Key
Enter pass phrase for ca-key.pem:


授权插件提供更细粒度的控制,以补充来自相互TLS的身份验证。除了上述文档中描述的其他信息之外,在Docker守护程序上运行的授权插件还会收到用于连接Docker客户端的证书信息。

对于客户端身份验证,请创建客户端密钥和证书签名请求:

注意:为了简化下一步,您可以在Docker守护程序的主机上执行此步骤。

$ openssl genrsa -out key.pem 4096
Generating RSA private key, 4096 bit long modulus
.........................................................++
................++
e is 65537 (0x10001)

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


要使密钥适合客户端身份验证,请创建扩展配置文件:

$ echo extendedKeyUsage = clientAuth >> extfile.cnf

现在,生成签名证书:

$ openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \
  -CAcreateserial -out cert.pem -extfile extfile.cnf
Signature ok
subject=/CN=client
Getting CA Private Key
Enter pass phrase for ca-key.pem:


生成后cert.pemserver-cert.pem您可以安全地删除两个证书签名请求:

$ rm -v client.csr server.csr


默认umask值为022,您的密钥对于您和您的组来说是世界可读和可写的。

要保护您的密钥免受意外损坏,请删除其写入权限。要使它们只能被您读取,请更改文件模式,如下所示:

$ chmod -v 0400 ca-key.pem key.pem server-key.pem

证书可以是世界可读的,但您可能希望删除写访问以防止意外损坏:

$ chmod -v 0444 ca.pem server-cert.pem cert.pem

现在,您可以使Docker守护程序仅接受来自提供CA信任的证书的客户端的连接(不推荐使用此方法):

$ dockerd --tlsverify --tlscacert=ca.pem --tlscert=server-cert.pem --tlskey=server-key.pem \
  -H=0.0.0.0:2376

上一步可以通过修改配置,使用证书 :

归集服务器证书

$ cp server-*.pem  /etc/docker/
$ cp ca.pem /etc/docker/

修改docker配置

$ vi /lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd
替换
ExecStart=/usr/bin/dockerd --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 -H unix:///var/run/docker.sock

重起docker

$ systemctl restart docker

最后,为客户端设置做准备

归集客户端证书

$ cp -v {ca,cert,key}.pem ~/.docker

将.docker文件夹拷贝至客户端

同时 需关闭防火墙 

$ service firewalld stop

要连接到Docker并验证其证书,请提供客户端密钥,证书和可信CA:

在客户端计算机上运行下面命令 进行验证

此步骤应在Docker客户端计算机上运行。因此,您需要将CA证书,服务器证书和客户端证书复制到该计算机。

注意:将$HOST以下示例中的所有实例替换为Docker守护程序主机的DNS名称。

$ docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem \
  -H=$HOST:2376 version

Docker现在默认安全连接:

$ docker ps

或用以下方法进行验证(在客户端运行)

$ curl https://$HOST:2376/images/json \
  --cert ~/.docker/cert.pem \
  --key ~/.docker/key.pem \
  --cacert ~/.docker/ca.pem

参考链接   https://docs.docker.com/engine/security/https/#secure-by-default

第三步:docker-client集成HTTPS 使用证书登陆(openssl tls) 

final DockerClient docker = DefaultDockerClient.builder()
    .uri(URI.create("https://boot2docker:2376"))
    .dockerCertificates(new DockerCertificates(Paths.get("/Users/rohan/.docker")))
    .build();

参考链接:https://github.com/spotify/docker-client/blob/master/docs/user_manual.md

异常处理:

在此过程中,我曾遇到PKIX path validation failed: mestamp check failed 错误异常

解决方法:调增服务端和客户端时间,确保两者时间一致

参考链接:https://jingyan.baidu.com/article/455a99505aa79ea1662778a5.html