{{item}}
{{item.title}}
{{items.productName}}
{{items.price}}/年
{{item.title}}
部警SSL证书可实现网站HTTPS加密保护及身份的可信认证,防止传输数据的泄露或算改,提高网站可信度和品牌形象,利于SEO排名,为企业带来更多访问量,这也是网络安全法及PCI合规性的必备要求
前往SSL证书本文将详细介绍Docker中配置自签名证书的完整流程,涵盖证书生成、容器/服务配置、客户端信任设置及常见问题解决,适用于本地开发、Docker Swarm集群及私有仓库等场景。
在开始配置前,需确保以下工具已安装:
1. Docker Engine:版本≥18.09(支持TLS 1.3及最新安全特性);
2. OpenSSL:用于生成自签名证书(Linux/macOS预装,Windows需手动安装);
3. mkcert(可选):简化本地开发环境证书生成(支持跨平台,自动信任证书);
4. Docker Compose(可选):用于快速部署多容器应用(如Nginx+后端服务)。
自签名证书的生成需解决域名/IP匹配(SAN)问题,否则浏览器/客户端会提示“证书不受信任”。以下是两种常用方式:
OpenSSL是生成自签名证书的经典工具,需手动指定SAN信息(如域名、IP),适用于Docker Swarm集群或私有仓库的TLS加密。
mkdir -p /etc/docker/certs/{ca,server,client}
cd /etc/docker/certs
CA证书用于签署服务器和客户端证书,是自签名体系的信任根。
# 生成CA私钥(AES256加密,密码设为"Passw0rd!")
openssl genrsa -aes256 -out ca-key.pem 4096
# 生成CA证书(有效期10年,CN为"Local Docker CA")
openssl req -x509 -new -nodes -key ca-key.pem -sha256 -days 3650 -out ca.pem \
-subj "/C=CN/ST=Shanghai/L=Shanghai/O=Docker/CN=Local Docker CA"
服务器证书需包含SAN信息(如IP地址、域名),否则客户端会提示“证书中的域名与请求的不匹配”。
# 创建SAN配置文件(san.cnf)
cat > san.cnf <<EOF
[req]
default_bits = 4096
prompt = no
default_md = sha256
distinguished_name = dn
[dn]
C = CN
ST = Shanghai
L = Shanghai
O = Docker
CN = docker-host.example.com # 替换为你的Docker主机域名或IP
[v3_req]
keyUsage = keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
IP.1 = 192.168.1.100 # 替换为你的Docker主机IP
DNS.1 = docker-host.example.com # 替换为你的Docker主机域名
EOF
# 生成服务器私钥
openssl genrsa -out server-key.pem 4096
# 生成证书签名请求(CSR)
openssl req -new -key server-key.pem -out server.csr -config san.cnf
# 签署服务器证书(使用CA证书,有效期1年)
openssl x509 -req -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem \
-days 365 -sha256 -extfile san.cnf -extensions v3_req
若需限制Docker客户端的访问权限(如仅允许特定客户端连接守护进程),需生成客户端证书。
# 生成客户端私钥
openssl genrsa -out client-key.pem 4096
# 生成客户端CSR
openssl req -new -key client-key.pem -out client.csr -subj "/C=CN/ST=Shanghai/L=Shanghai/O=Docker Client/CN=client.example.com"
# 签署客户端证书
openssl x509 -req -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem \
-days 365 -sha256
mkcert是专为本地开发设计的证书工具,自动信任证书(无需手动导入系统信任库),支持通配符域名(如*.local),适合Nginx、Node.js等容器化应用的HTTPS测试。
mkcert -install
此命令会将mkcert的根证书添加到系统的信任库(Windows的“受信任的根证书颁发机构”、macOS的“钥匙串访问”)。
# 生成通配符证书(支持*.local域名,有效期1年)
mkcert "*.local" localhost 127.0.0.1 ::1
输出示例:
Created a new certificate: local+3.pem
Key file: local+3-key.pem
步骤4:验证证书
mkcert --verify "*.local"
若输出Verified OK,则证书有效。
Docker守护进程(dockerd)的TLS配置用于加密远程API调用(如docker -H tcp://host:port命令),防止未授权访问。以下是配置步骤:
Docker的配置文件通常位于/etc/docker/daemon.json(Linux)或C:\ProgramData\Docker\config\daemon.json(Windows)。若文件不存在,需手动创建。
添加以下配置(替换为你的证书路径):
{
"hosts": ["unix:///var/run/docker.sock", "tcp://0.0.0.0:2376"], # 监听所有TCP接口(生产环境建议指定IP)
"tls": true,
"tlsverify": true,
"tlscacert": "/etc/docker/certs/ca/ca.pem", # CA证书路径
"tlscert": "/etc/docker/certs/server/server-cert.pem",# 服务器证书路径
"tlskey": "/etc/docker/certs/server/server-key.pem" # 服务器私钥路径
}
配置生效后,需重启Docker服务:
使用以下命令验证Docker守护进程的TLS配置是否生效:
# 使用TLS连接Docker守护进程(替换为你的证书路径)
docker --tlsverify --tlscacert=/etc/docker/certs/ca/ca.pem \
--tlscert=/etc/docker/certs/client/client-cert.pem \
--tlskey=/etc/docker/certs/client/client-key.pem \
version
若输出Docker版本信息(如Client: Docker Engine - Community),则配置成功。
若需为容器化应用(如Nginx)启用HTTPS,需将自签名证书挂载到容器中,并配置Nginx使用该证书。
创建nginx.conf文件,配置HTTPS监听(端口443):
server {
listen 443 ssl;
server_name localhost *.local; # 匹配所有*.local域名
# 证书路径(挂载到容器中的路径)
ssl_certificate /etc/nginx/ssl/local+3.pem;
ssl_certificate_key /etc/nginx/ssl/local+3-key.pem;
# SSL优化配置(可选)
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 反向代理到后端服务(可选)
location / {
proxy_pass http://backend:8080; # backend是后端服务的Docker网络别名
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
# 重定向HTTP到HTTPS(可选)
server {
listen 80;
server_name localhost *.local;
return 301 https://$host$request_uri;
}
使用Docker Compose部署Nginx服务,挂载证书和配置文件:
version: '3.9'
services:
nginx:
image: nginx:latest
ports:
- "80:80" # HTTP端口(重定向到HTTPS)
- "443:443" # HTTPS端口
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf # 挂载Nginx配置文件
- ./ssl:/etc/nginx/ssl # 挂载证书目录(需提前将mkcert生成的证书复制到此处)
networks:
- mynet
backend:
image: your-backend-image:latest # 替换为你的后端服务镜像
networks:
- mynet
networks:
mynet:
driver: bridge
# 创建证书目录(将mkcert生成的证书复制到此处)
mkdir -p ssl
cp ~/.local/share/mkcert/local+3.pem ssl/
cp ~/.local/share/mkcert/local+3-key.pem ssl/
# 启动服务
docker-compose up -d
# 验证HTTPS访问
curl -k https://localhost # -k忽略证书警告(本地开发环境)
若输出Nginx的欢迎页面,则配置成功。
若需搭建私有Docker仓库(如Registry),并使用自签名证书加密访问,需将证书挂载到Registry容器中,并配置客户端信任证书。
创建registry.yml文件,部署Registry服务:
version: '3.9'
services:
registry:
image: registry:2.8
ports:
- "443:443" # HTTPS端口
volumes:
- ./registry-data:/var/lib/registry # 挂载数据目录
- ./certs:/certs # 挂载证书目录(mkcert生成的证书)
environment:
- REGISTRY_HTTP_ADDR=0.0.0.0:443 # 监听443端口
- REGISTRY_HTTP_TLS_CERTIFICATE=/certs/local+3.pem # 证书路径
- REGISTRY_HTTP_TLS_KEY=/certs/local+3-key.pem # 私钥路径
networks:
- mynet
networks:
mynet:
driver: bridge
要让Docker客户端信任私有仓库的自签名证书,需将CA证书复制到客户端的/etc/docker/certs.d/<registry-domain>/ca.crt路径(Linux)或C:\ProgramData\Docker\certs.d\<registry-domain>\ca.crt路径(Windows)。
Linux客户端:
# 创建证书目录(替换为你的registry域名)
sudo mkdir -p /etc/docker/certs.d/registry.local:443
# 复制CA证书(mkcert生成的根证书)
sudo cp ~/.local/share/mkcert/rootCA.pem /etc/docker/certs.d/registry.local:443/ca.crt
# 重启Docker服务
sudo systemctl restart docker
Windows客户端:
# 创建证书目录(替换为你的registry域名)
New-Item -ItemType Directory -Path "C:\ProgramData\Docker\certs.d\registry.local:443" -Force
# 复制CA证书(mkcert生成的根证书,重命名为ca.crt)
Copy-Item "$env:USERPROFILE\.local\share\mkcert\rootCA.pem" "C:\ProgramData\Docker\certs.d\registry.local:443\ca.crt"
# 重启Docker Desktop服务
Restart-Service docker
# 登录私有仓库(替换为你的registry域名)
docker login registry.local:443
# 推送镜像到私有仓库
docker tag nginx:latest registry.local:443/nginx:latest
docker push registry.local:443/nginx:latest
# 拉取镜像
docker pull registry.local:443/nginx:latest
若推送/拉取成功,则配置成功。
原因:客户端未信任自签名证书的CA。
解决方案:
原因:证书未包含请求的域名或IP(SAN信息缺失)。
解决方案:
原因:私钥文件权限不足或格式错误。
解决方案:
原因:未登录私有仓库或证书配置错误。
解决方案:
1. 生产环境使用CA颁发的证书:自签名证书不适合生产环境,建议使用Let’s Encrypt(免费)或商业证书颁发机构(如DigiCert)的证书;
2. 定期更新证书:自签名证书的有效期建议设置为1年以内,避免过期导致服务中断;
3. 使用mkcert简化本地开发:mkcert自动信任证书,无需手动导入,适合本地开发环境;
4. 限制TLS版本:禁用TLS 1.0和TLS 1.1,仅使用TLS 1.2及以上版本(如Nginx的ssl_protocols TLSv1.2 TLSv1.3;);
5. 备份证书:定期备份CA证书和服务器证书,避免丢失导致服务无法恢复。
在Docker环境中配置自签名证书,需根据场景选择合适的证书生成方式(OpenSSL或mkcert),并正确配置Docker守护进程、容器化应用或私有仓库。通过本文的步骤,可实现Docker环境的加密通信,保护数据安全。
Dogssl.com拥有20年网络安全服务经验,提供构涵盖国际CA机构Sectigo、Digicert、GeoTrust、GlobalSign,以及国内CA机构CFCA、沃通、vTrus、上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!