docker配置TLS开启远程访问

在安装好docker及docker的加速器后,我们需要通过idea访问到docker以通过idea插件去自动化部署项目到docker容器。默认情况下,Docker通过非网络UNIX套接字运行。它还可以选择使用HTTP套接字进行通信。如果您需要通过网络以安全方式访问Docker,可以通过指定该tlsverify标志并将Docker的tlscacert标志指向受信任的CA证书来启用TLS。

1.使用openssl创建CA

要生成CA,首先需要依赖openssl,使用openssl version查看系统是否已经安装过openssl,如果没安装,需要先安装下。

1.1生成CA私钥和公钥
## 切换目录
[root@admin docker]# /etc/docker
## 生成私钥证书 (中间需要输入密码,请记住这个密码)
[root@admin docker]# 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: ## 确认密码

## 生成公钥证书
[root@admin docker]# 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) [XX]:CN ## 输入国家
State or Province Name (full name) []:shanxi ## 输入省
Locality Name (eg, city) [Default City]:xian ## 输入市
Organization Name (eg, company) [Default Company Ltd]:shanxiruite ## 公司
Organizational Unit Name (eg, section) []:dev ## 组织
Common Name (eg, your name or your server's hostname) []:ruite ## 输入域名,请注意记住这个hostname......
Email Address []:[email protected] ## 输入邮箱

完成后你会在当前文件夹下看见ca-key.pem和ca.pem文件
在这里插入图片描述

1.2 生成服务器密钥和证书签名请求(CSR)
## 生成服务密钥
[root@admin docker]# openssl genrsa -out server-key.pem 4096
Generating RSA private key, 4096 bit long modulus
.............................................................................++
...................................++
e is 65537 (0x10001)
## 生成server证书请求文件 下面的$HOST需要与你生成公钥证书时的hostname保持一致。后面还需要用到这个。
[root@admin docker]# openssl req -subj "/CN=$HOST" -sha256 -new -key server-key.pem -out server.csr
## 编写设置extfile.cnf并ip
[root@admin docker]# echo subjectAltName = DNS:$HOST,IP:127.0.0.1 >> extfile.cnf
[root@admin docker]# echo extendedKeyUsage = serverAuth >> extfile.cnf
#使用CA证书及CA密钥以及上面的server证书请求文件进行签发,生成server自签证书
[root@admin docker]# 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=yang.com # 这个是我设置的hostname
Getting CA Private Key
Enter pass phrase for ca-key.pem: ## 输入密码

在这里插入图片描述

1.3 生成client密钥和证书
## 生成client证书RSA私钥文件
[root@admin docker]# openssl genrsa -out key.pem 4096
Generating RSA private key, 4096 bit long modulus
........................++
...................................++
e is 65537 (0x10001)
## 生成client证书请求文件 (注意ruite.com)
[root@admin docker]# openssl req -subj '/CN=client' -new -key key.pem -out client.csr
## 创建一个新的扩展配置文件
[root@admin docker]# echo extendedKeyUsage = clientAuth > extfile-client.cnf
## 生成签名证书
[root@admin docker]# openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile-client.cnf
Signature ok
subject=/CN=client
Getting CA Private Key
Enter pass phrase for ca-key.pem: ## 输入密码

在这里插入图片描述
生成后,需要将client.csr、server.csr、extfile.cnf、extfile-client.cnf删除掉

rm -v client.csr server.csr extfile-client.cnf extfile.cnf
1.4 修改相关文件的权限
## 更改密钥权限
[root@admin docker]# chmod -v 0400 ca-key.pem key.pem server-key.pem
## 更改证书权限
[root@admin docker]# chmod -v 0444 ca.pem server-cert.pem cert.pem

2.修改docker配置文件

2.1 在/etc/docker/daemon.json中加入以下内容

其中hosts中的192.168.80.128为我自己的ip地址。

 "tlsverify": true,
 "tlscacert": "/etc/docker/ca.pem",
 "tlscert": "/etc/docker/server-cert.pem",
 "tlskey": "/etc/docker/server-key.pem",
 "hosts": ["tcp://192.168.80.128:2376","unix:///var/run/docker.sock"]

vim /etc/docker/daemon.json
修改后内容如下(前两项为镜像加速器和私有仓库):
在这里插入图片描述
这里设置时候,有两种:
1.设置tlsverify,tlscacert,tlscert,tlskey;这种是需要验证客户端
2.设置tls,tlscert,tlskey;这种不验证客户端

2.2 修改/lib/systemd/system/docker.service

vim /lib/systemd/system/docker.service
修改后的内容如下:
在这里插入图片描述

## 查看防火墙状态
systemctl status firewalld : 
## 如果状态Active: active ,需要将2376端口放开(好像说是docker启动会自动启动防火墙,防火墙不能关闭,这里坑了我很久。。。)
## 将2376加入允许的端口列表
firewall-cmd --zone=public --add-port=2376/tcp --permanent
## 重载防火墙
firewall-cmd --reload
## 查看是否加入成功
firewall-cmd --zone=public --query-port=2376/tcp
## 重新加载docker配置
systemctl daemon-reload
## 重启
systemctl restart docker
## 查看docker是否运行正常
systemctl is-active docker
## 查看2376端口是否已启动 如果看见了2376证明前面过程没有问题
netstat -tunlp

4. 验证docker连接

4.1 idea中验证

idea中验证时候,需要先修改host文件,将你设置的主机名与主机ip进行绑定。修改C:\Windows\System32\drivers\etc\hosts文件。我修改后的内容为:
在这里插入图片描述
然后需要将将刚才生成的ca.pem,cert.pem,key.pem拷贝到一个目录中,在idea中的下载后docker的插件后,在setting->docker中新建连接。我的链接如图:
在这里插入图片描述
注意engine api url那块的是https://yang.com:2376。看到提示successful就表明成功。。。

4.2 客户机中验证

首先客户机中需要安装好docker,然后在客户机中的hostname加入刚才的hostname。

vim /etc/hosts

在这里插入图片描述
编辑hostname文件将yang.com(主机名)加入:

vim /etc/hostname

然后重启下服务器。将ca.pem,cert.pem,key.pem拷贝到目录中,使用命令测试链接:

[root@admin dockercert]# docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H yang.com:2376 version
Client: Docker Engine - Community
 Version:           19.03.0
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        aeac9490dc
 Built:             Wed Jul 17 18:15:40 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.0
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       aeac9490dc
  Built:            Wed Jul 17 18:14:16 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 runc:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

出现以上内容就表示成功了。。。。

6.配置docker默认安全

如果要默认保护Docker客户端连接的安全性,可以将文件移动到.docker主目录— 的目录中,并同时设置 DOCKER_HOST和DOCKER_TLS_VERIFY变量(而不是在每次调用时传递 -H=tcp://$HOST:2376和–tlsverify

mkdir -pv ~/.docker
cd /etc/docker
cp -v {ca,cert,key}.pem ~/.docker
export DOCKER_HOST=tcp://192.168.80.128:2376 DOCKER_TLS_VERIFY=1

官网参考文档:
1.生成CA证书
2.配置Docker守护程序

发布了97 篇原创文章 · 获赞 44 · 访问量 14万+

猜你喜欢

转载自blog.csdn.net/github_38924695/article/details/103489975