执行curl命令遇self signed certificate in certificate chain错误的解决方法
解决curl "self signed certificate in certificate chain" 错误的实用方案
这个问题我日常调试中碰到过好多次,本质就是curl默认不信任目标服务器的自签名证书,或者服务器的证书链不完整导致验证失败。下面给你分场景整理了几种解决办法:
1. 临时跳过证书验证(仅测试环境用!)
如果只是临时测试接口,不想折腾证书配置,可以直接让curl忽略证书检查:
curl -k https://your-target-url.com # 或者用完整参数写法 curl --insecure https://your-target-url.com
⚠️ 重要提醒:这个方法会跳过所有证书验证,绝对不能在生产环境使用,会暴露你的请求被中间人攻击的风险!
2. 永久信任目标服务器的自签名证书(生产环境推荐)
如果需要长期访问这个服务器,正确的做法是把它的证书加入系统信任列表,或者在curl中指定信任该证书:
步骤1:获取目标服务器的证书
用openssl命令从服务器导出证书:
openssl s_client -showcerts -connect your-target-url.com:443 </dev/null 2>/dev/null | openssl x509 -outform PEM > target-server-cert.pem
这个命令会连接目标服务器的443端口,提取并保存证书为PEM格式的文件。
步骤2:添加到系统信任列表(全局生效)
- Linux系统:把证书文件放到
/usr/local/share/ca-certificates/目录,然后更新证书缓存:
之后curl访问该服务器时就会自动信任证书了。sudo cp target-server-cert.pem /usr/local/share/ca-certificates/ sudo update-ca-certificates - macOS系统:双击证书文件,在弹出的钥匙串访问中选择“系统”钥匙串,然后设置该证书的信任为“始终信任”。
步骤3:仅给curl指定证书(局部生效)
如果不想修改系统全局证书,可以每次curl时指定信任的证书文件:
curl --cacert target-server-cert.pem https://your-target-url.com
3. 检查并修复证书链不完整问题
有时候报错不是因为自签名,而是服务器缺少中间证书,导致curl无法完成整个证书链的验证。可以用下面的命令查看证书链详情:
openssl s_client -connect your-target-url.com:443
如果输出中出现untrusted或者verify return code: 21 (unable to verify the first certificate),说明需要把中间证书和根证书合并成一个PEM文件,然后按照上面的方法添加信任即可。
内容的提问来源于stack exchange,提问作者Kanika




