配置Docker环境变量访问远程守护进程报tls: bad certificate如何解决
故障原因
手动传参指定证书可正常访问,说明服务端TLS配置、证书本身有效性均无问题,环境变量模式报错是Docker客户端默认加载逻辑和路径解析问题导致,常见触发点有两个:
- 证书文件名不符合默认规则:使用
DOCKER_CERT_PATH指定证书目录时,Docker客户端不会识别自定义命名的client-cert.pem、client-key.pem,仅会固定读取目录下三个命名的文件:ca.pem(CA根证书)、cert.pem(客户端公钥证书)、key.pem(客户端私钥) - 路径中的
~未被正确展开:部分shell场景下导出环境变量时直接写~/certs不会自动解析为用户家目录的绝对路径,导致客户端实际找不到证书文件,触发证书校验失败。
修复步骤
- 第一步:重命名证书文件匹配Docker默认规则
进入存放客户端证书的目录,执行重命名操作:
cd ~/certs mv client-cert.pem cert.pem mv client-key.pem key.pem
执行完后确认目录下存在ca.pem、cert.pem、key.pem三个文件即可。
- 第二步:使用绝对路径导出环境变量
不要在DOCKER_CERT_PATH中使用~符号,直接写全绝对路径,例如root用户对应路径为/root/certs,普通用户xxx对应路径为/home/xxx/certs,导出命令参考:
export DOCKER_HOST=tcp://$MY_HOST:$MY_PORT export DOCKER_TLS_VERIFY=1 export DOCKER_CERT_PATH=/root/certs # 替换为你自己的证书目录绝对路径
- 第三步:验证效果
直接执行不带任何TLS参数的docker命令测试:
docker ps
正常返回容器列表即代表修复完成。
额外排查项:如果上述操作完成后仍报错,检查证书目录下三个文件的权限,确保当前执行docker命令的用户有文件读权限,可执行
chmod 644 /你的证书路径/*.pem配置读权限,注意不要给私钥文件赋予执行权限。
内容的提问来源于stack exchange,提问作者javaxiss
相关产品推荐
相关产品推荐

