如何生成可绕过Common Name校验的Docker自签名SSL证书?
问题:Docker SSL证书CN校验失败,如何生成支持IP访问的证书
将证书脚本中的CN="192.168.56.10"替换为CN="*"后,访问https://192.168.56.10:2375/version时出现如下错误:
Symfony\Component\HttpClient\Exception\TransportException: SSL: certificate subject name '*' does not match target host name '192.168.56.10' for "https://192.168.56.10:2375/version"
原因说明
通配符*作为Common Name(CN)仅适用于域名场景,无法匹配IP地址。SSL校验IP访问时,会检查证书的**Subject Alternative Name(SAN)**字段是否包含目标IP,而非仅依赖CN。
修改后的证书生成脚本
以下脚本会生成包含指定IP的SAN扩展的服务器证书,解决IP访问时的校验问题:
#!/bin/bash set -eo pipefail cd $(dirname $0) # 配置信息 C=PL ST=Mazovia L=Warsaw O="PHP-HTTP" TARGET_IP="192.168.56.10" # 1. 生成CA证书和私钥(用于签署服务器证书) openssl req -out ca.pem -new -x509 -subj "/C=$C/ST=$ST/L=$L/O=$O/CN=docker-ca" -passout pass:password -keyout ca.key # 2. 生成服务器私钥 openssl genrsa -out server.key # 3. 生成证书请求(CSR),添加SAN扩展指定目标IP openssl req -key server.key -new -out server.req -subj "/C=$C/ST=$ST/L=$L/O=$O/CN=*" -passout pass:password -addext "subjectAltName=IP:$TARGET_IP" # 4. 用CA签署服务器证书,确保SAN扩展被包含 openssl x509 -req -in server.req -CA ca.pem -CAkey ca.key -CAserial file.srl -out server.pem -passin pass:password -extfile <(echo "subjectAltName=IP:$TARGET_IP")
关键调整点
- 显式生成CA私钥
ca.key(原脚本未明确指定,避免依赖默认生成的privkey.pem) - 在生成证书请求和签署证书时,都添加
subjectAltName扩展,指定允许访问的IP地址 - 若需支持多个IP或域名,可扩展SAN字段,例如:
subjectAltName=IP:192.168.56.10,IP:127.0.0.1,DNS:docker.local
测试注意事项
确保测试脚本中使用的客户端证书信任该CA(或直接使用生成的ca.pem作为根证书),避免出现证书不信任的问题。
内容的提问来源于stack exchange,提问作者sebastian_t
相关产品推荐
相关产品推荐

