2026.06.02 | youres | 32次围观
问题现象:curl报错"SSL certificate problem"
用curl访问HTTPS网站时,突然报这个错:
curl: (60) SSL certificate problem: unable to get local issuer certificate
这不是网站的问题,是你本地curl找不到完整的证书链。本文用5个实战步骤,带你彻底搞清楚证书链不完整的原理、排查方法和修复方案。
什么是证书链不完整?
HTTPS证书不是单张证书,而是一条"链":
- 叶子证书:分配给你的域名的证书
- 中间证书:连接叶子证书和根证书的桥梁
- 根证书:操作系统的信任库里内置的顶级证书
完整的证书链应该是:叶子证书 → 中间证书 → 根证书
如果服务器只配置了叶子证书,没配置中间证书,curl就会报错"unable to get local issuer certificate"。
步骤1:用curl -v查看证书链详情
先看看服务器返回的证书链到底缺了什么。用-v参数查看详细的SSL握手过程:
curl -v https://www.youres.cn
如果报错,会显示:
* SSL certificate verify result: unable to get local issuer certificate (20)
这说明curl无法验证服务器证书的签发者。
步骤2:用openssl查看证书链是否完整
curl底层用的是openssl,用openssl命令可以直接查看服务器返回的证书链:
openssl s_client -showcerts -connect www.youres.cn:443
如果输出里只有一段-----BEGIN CERTIFICATE-----,说明服务器只发了叶子证书,没发中间证书。正常的输出应该有2-3段证书(叶子证书 + 中间证书)。
步骤3:确认本地CA证书库是否完整
curl验证证书时,依赖本地的CA证书库。检查curl使用的CA证书库路径:
curl --version
如果本地CA证书库太旧,可能缺少新的根证书或中间证书。更新方法:
# Ubuntu/Debian
sudo apt update && sudo apt install --reinstall ca-certificates
# CentOS/RHEL
sudo yum reinstall ca-certificates
步骤4:修复服务器证书链配置(推荐方案)
最彻底的解决方法是让服务器返回完整的证书链。以Nginx为例:
错误配置(只配置叶子证书):
ssl_certificate /path/to/www.youres.cn.crt; # 只有叶子证书
ssl_certificate_key /path/to/www.youres.cn.key;
正确配置(叶子证书 + 中间证书合并成一个文件):
# 合并叶子证书和中间证书
cat www.youres.cn.crt intermediate.crt > www.youres.cn.fullchain.crt
# Nginx配置
ssl_certificate /path/to/www.youres.cn.fullchain.crt;
ssl_certificate_key /path/to/www.youres.cn.key;
步骤5:临时绕过证书验证(不推荐,仅调试用)
如果急着调试,可以临时跳过证书验证(生产环境不要用):
# 方法1:用-k参数
curl -k https://www.youres.cn
# 方法2:指定不验证证书
curl --insecure https://www.youres.cn
总结
curl证书链不完整的问题,本质是服务器没有返回完整的证书链(叶子证书+中间证书)。排查步骤:
- 用
curl -v查看SSL握手详情 - 用
openssl s_client -showcerts确认证书链是否完整 - 检查本地CA证书库是否太旧
- 修复服务器配置,合并叶子证书和中间证书
- 临时调试可以用
-k参数,但生产环境务必配置完整证书链
证书链完整不仅解决curl报错,还能兼容更多客户端。花5分钟配置好,省去无数调试时间。
相关文章推荐:
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论