docker-client的HTTPS 使用证书登陆(openssl tls) 请求的具体实现

第一步:设置静态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
参考链接: https://blog.csdn.net/get_set/article/details/50707553

第二步:使用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://blog.csdn.net/evane1890/article/details/78543332

                 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

                 https://blog.csdn.net/taokai_110/article/details/73162891?utm_source=itdadao&utm_medium=referral



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值