docker配置tls (一) 2376安全配置

本文详细介绍了如何使用TLS安全连接配置Docker服务,包括生成证书、服务器和客户端配置步骤,以及通过Docker命令和curl进行测试的方法。

一、官方资料

  1. 官网资料
    https://docs.docker.com/engine/reference/commandline/dockerd/

  2. 创建证书步骤
    官网Protect the Docker daemon socket https://docs.docker.com/engine/security/https/

二、创建证书

生成的证书

ca-key.pem
ca.pem
cert.pem
key.pem
server-cert.pem
server-key.pem

服务器使用的证书
	ca.pem
	 server-cert.pem
	 server-key.pem 
	 
客户端使用
    cert.pem
    ca.pem
    key.pem 

生成证书步骤

1.根证书

ca-key.pem

根证书秘钥

openssl genrsa -out  ca-key.pem 4096

ca.pem

生成根证书

openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem

-days 365 可以设置长的证书有效期,单位天

根据提示输入证书需要的信息

[root@localhost docker_ssl]# 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) []:
Locality Name (eg, city) [Default City]:
Organization Name (eg, company) [Default Company Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server's hostname) []:docker166
Email Address []:

2. 服务端证书

server-key.pem

$ openssl genrsa -out server-key.pem 4096

server.csr

生成server.csr,在生成server-cert.pem需要用到
/CN 一般为你的dns=docker166

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

server-key.pem

openssl genrsa -out server-key.pem 4096

server-cert.pem

需要用到ca-key.pem的密码, subjectAltName

echo subjectAltName = DNS:docker166,IP:192.168.72.166,IP:127.0.0.1 >> extfile.cnf
echo extendedKeyUsage = serverAuth >> extfile.cnf
openssl x509 -req -days 36500 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem
-CAcreateserial -out server-cert.pem -extfile extfile.cnf

例子:

[root@localhost docker_ssl]# echo subjectAltName = DNS:docker166,IP:192.168.72.166,IP:127.0.0.1 >> extfile.cnf                
[root@localhost docker_ssl]# echo extendedKeyUsage = serverAuth >> extfile.cnf
[root@localhost docker_ssl]# cat extfile.cnf 
subjectAltName = DNS:docker166,IP:192.168.72.166,IP:127.0.0.1
extendedKeyUsage = serverAuth
[root@localhost docker_ssl]# 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=ffcs-ark
Getting CA Private Key
Enter pass phrase for ca-key.pem:

subjectAltName为
[root@localhost .docker]# curl https://192.168.72.110:2376/images/json --cert ~/.docker/cert.pem --key ~/.docker/key.pem --cacert ~/.docker/ca.pem
curl: (51) Unable to communicate securely with peer: requested domain name does not match the server’s certificate.

3.客户端证书

key.pem
openssl genrsa -out key.pem 4096
cert.pem

days设置100年 -days 365修改为 -days 36500

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

例子,设置有效期为10年

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

三、docker tls服务端配置

方式一:命令启动方式设置

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

证书放在默认目录下 ~/.docker/可以不输入证书

[root@localhost docker_ssl]# docker --tlsverify ps
error during connect: Get https://localhost:2376/v1.26/containers/json: x509: certificate is valid for docker166, not localhost
[root@localhost docker_ssl]# docker --tlsverify -H=127.0.0.1 ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

方式二:配置文件配置

docker 1.13在 /etc/sysconfig/docker-network文件中设置, 配置https方式docker时必须同时开启2375和2376端口监听,http只开启一个端口即可

vi /etc/sysconfig/docker-network 修改文件网络配置

[root@localhost docker_ssl]# vi /etc/sysconfig/docker-network 
# /etc/sysconfig/docker-network
DOCKER_NETWORK_OPTIONS="--tlsverify --tlscacert=/root/.docker/ca.pem --tlscert=/root/.docker/server-cert.pem --tlskey=/root/.docker/server-key.pem -H=0.0.0.0:2376 -H=0.0.0.0:2375"

重启

systemctl daemon-reload  && systemctl restart docker

docker配置文件位置cat /usr/lib/systemd/system/docker.service

四、客户端请求测试

docker本机测试tls:

测试成功/root/.docker文件夹下已经存在证书。
docker --tls version 相当于
docker --tls --tlscacert /root/.docker/ca.pem --tlscert /root/.docker/cert.pem --tlskey /root/.docker/key.pem version

[root@localhost .docker]#  docker --tls version
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: docker-1.13.1-88.git07f3374.el7.centos.x86_64
 Go version:      go1.9.4
 Git commit:      07f3374/1.13.1
 Built:           Fri Dec  7 16:13:51 2018
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: docker-1.13.1-88.git07f3374.el7.centos.x86_64
 Go version:      go1.9.4
 Git commit:      07f3374/1.13.1
 Built:           Fri Dec  7 16:13:51 2018
 OS/Arch:         linux/amd64
 Experimental:    false

相关的参数

Options:
      --config string      Location of client config files (default "/root/.docker")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/root/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/root/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/root/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote

docker -H远程请求

docker --tls -H 192.168.72.166 version

[root@docker110 ~]# docker --tls -H 192.168.72.166 version
Client:
 Version:         1.13.1
 API version:     1.26
 Package version: docker-1.13.1-88.git07f3374.el7.centos.x86_64
 Go version:      go1.10.3
 Git commit:      b2f74b2/1.13.1
 Built:           Tue Mar 12 10:27:24 2019
 OS/Arch:         linux/amd64

Server:
 Version:         1.13.1
 API version:     1.26 (minimum version 1.12)
 Package version: docker-1.13.1-88.git07f3374.el7.centos.x86_64
 Go version:      go1.9.4
 Git commit:      07f3374/1.13.1
 Built:           Fri Dec  7 16:13:51 2018
 OS/Arch:         linux/amd64
 Experimental:    false

DOCKER_CERT_PATH.
如下指定证书的默认目录

$ export DOCKER_CERT_PATH=~/.docker/zone1/
$ docker --tlsverify ps

curl方式

$ curl ${HOST} --cert ~/.docker/cert.pem --key ~/.docker/key.pem --cacert ~/.docker/ca.pem

例1:

curl https://192.168.72.166:2376/images/json --cert ~/.docker/cert.pem --key ~/.docker/key.pem --cacert ~/.docker/ca.pem  
[root@docker110 ~]#  curl https://192.168.72.166:2376/images/json --cert ~/.docker/cert.pem --key ~/.docker/key.pem --cacert ~/.docker/ca.pem  
[]

例2,多行命令:

[root@localhost docker_ssl]# curl https://192.168.72.166:2376/images/json \
> --cert ~/.docker/cert.pem \
> --key ~/.docker/key.pem \
> --cacert ~/.docker/ca.pem
[]

其他

  1. Docker 服务 TLS 证书全自动生成 https://segmentfault.com/a/1190000012510820
  2. docker使用OpenSSL的自颁发证书创建HTTPS仓库 https://www.jianshu.com/p/bfdf41a5d8fc
<think> 我们正在讨论Docker配置TLS证书的方法。根据引用内容,配置TLS证书主要有两种方式:每次命令显式指定证书文件,或者配置环境变量和证书存放目录来简化操作。 同时,引用[4]还提到了如何修改Docker守护进程的配置以启用TLS认证。 下面我将分步骤说明如何配置: 1. 生成TLS证书:通常需要CA证书、服务器证书和客户端证书。但用户的问题集中在配置方法,所以这里不展开生成过程,假设证书已经生成。 2. 配置Docker守护进程(daemon)以启用TLS: 根据引用[4],我们需要修改Docker的启动配置(通常是`/etc/docker/daemon.json`或systemd的service文件)。 例如,在systemd管理的系统中,修改docker.service的ExecStart,添加TLS相关参数: ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2376 --tlsverify --tlscacert=/etc/docker/ca.pem --tlscert=/etc/docker/server-cert.pem --tlskey=/etc/docker/server-key.pem 这里,-H指定了监听端口2376(默认TLS端口),并使用了三个TLS相关的选项:--tlsverify(启用TLS验证),以及指定CA证书、服务器证书和密钥的路径。 3. 客户端使用TLS连接: a) 每次执行命令时指定参数(如引用[1]和[3]): docker --tlsverify --tlscacert=ca.pem --tlscert=cert.pem --tlskey=key.pem -H tcp://服务器IP:2376 version b) 简化操作(如引用[2]):将客户端所需的证书文件(ca.pem, cert.pem, key.pem)放入用户主目录的~/.docker目录下,并设置环境变量: export DOCKER_HOST=tcp://服务器IP:2376 export DOCKER_TLS_VERIFY=1 然后就可以直接使用docker命令,如:docker ps 注意:证书文件的权限通常需要设置为仅允许所有者读写(如400或600),否则Docker可能会报错。 因此,完整的配置包括服务器端配置和客户端配置两部分。 下面我将详细写出配置步骤。 </think> ### Docker 配置 TLS 证书的方法 配置 Docker TLS 证书涉及**服务器端配置**和**客户端连接**两个关键步骤,以下是详细流程: --- #### **、服务器端配置Docker 守护进程)** 1. **生成证书**(需提前准备): - CA 证书 (`ca.pem`) - 服务器证书 (`server-cert.pem`) - 服务器私钥 (`server-key.pem`) 2. **修改 Docker 配置文件** 编辑 systemd 服务文件(如 `/lib/systemd/system/docker.service`): ```ini ExecStart=/usr/bin/dockerd \ -H unix:///var/run/docker.sock \ -H tcp://0.0.0.0:2376 \ # 监听 TLS 默认端口 2376 --tlsverify \ # 启用 TLS 验证 --tlscacert=/etc/docker/ca.pem \ # CA 证书路径 --tlscert=/etc/docker/server-cert.pem \ # 服务器证书 --tlskey=/etc/docker/server-key.pem # 服务器私钥 ``` > 引用自 Docker 守护进程配置示例 [^4] 3. **重启服务生效**: ```bash sudo systemctl daemon-reload sudo systemctl restart docker ``` --- #### **二、客户端连接方式** ##### 方法 1:命令显式指定证书(适合临时操作) ```bash docker --tlsverify \ --tlscacert=./ca.pem \ --tlscert=./client/cert.pem \ --tlskey=./client/key.pem \ -H tcp://服务器IP:2376 ps ``` > 需在每次命令中指定证书路径和主机地址 [^1][^3] ##### 方法 2:环境变量配置(推荐长期使用) 1. **存放证书到 `~/.docker` 目录**: ```bash mkdir -p ~/.docker cp {ca,cert,key}.pem ~/.docker/ # 复制客户端证书文件 ``` 2. **设置环境变量**: ```bash export DOCKER_HOST=tcp://服务器IP:2376 # 指定 Docker 主机 export DOCKER_TLS_VERIFY=1 # 强制启用 TLS 验证 ``` 3. **直接使用命令**(无需额外参数): ```bash docker ps # 自动使用 ~/.docker 下的证书 ``` > 简化操作的推荐方式 [^2] --- #### **关键注意事项** 1. **证书权限**: 所有 `.pem` 文件需设置严格权限(如 `chmod 600 *.pem`) 2. **端口区别**: - 非加密端口:`2375` - TLS 加密端口:`2376` 3. **防火墙**: 确保服务器防火墙开放 `2376` 端口 --- ### 相关问题 1. 如何生成 Docker TLS 所需的 CA 证书和客户端证书? 2. Docker TLS 连接出现 `x509: certificate signed by unknown authority` 错误如何解决? 3. 如何在 Docker Swarm 集群中配置 TLS 加密通信? 4. 除了 TLS 证书,Docker 还有哪些远程连接的安全加固方法?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值