CLI下Curl/OpenSSL无法获取本地颁发者证书问题求助
解决方案:OpenSSL 无法获取本地颁发者证书(错误码20)
针对你在Ubuntu 5.4.0-42下遇到的这个问题,我整理了几个经过验证的可行方案,按优先级尝试:
1. 直接为OpenSSL指定系统CA证书文件
有时候OpenSSL默认没有正确加载系统的CA证书 bundle,你可以手动指定路径来测试:
openssl s_client -connect storage.googleapis.com:443 -CAfile /etc/ssl/certs/ca-certificates.crt
如果这个命令能成功验证证书,说明是默认路径的问题。可以通过设置环境变量永久解决:
# 临时生效,当前终端有效 export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt # 永久生效,添加到用户bash配置文件 echo 'export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt' >> ~/.bashrc source ~/.bashrc
2. 检查并修复OpenSSL配置文件
OpenSSL的默认配置可能存在路径错误,打开/etc/ssl/openssl.cnf,定位到[ CA_default ]部分,确认以下配置项:
dir = /etc/ssl # 基础目录 certs = $dir/certs # 证书存放路径 CApath = $dir/certs # CA证书路径 CAfile = $dir/certs/ca-certificates.crt # 合并后的CA bundle文件
如果有配置错误,修改后保存,再重新测试连接。
3. 手动添加Google的根证书到系统CA
可能你的系统CA存储中缺少Google服务依赖的根证书(比如GTS Root R1),可以手动添加:
# 下载Google根证书 curl -O https://pki.goog/gtsr1.crt # 转换为PEM格式(OpenSSL默认识别的格式) openssl x509 -in gtsr1.crt -out gtsr1.pem -outform PEM # 将证书复制到系统CA目录 sudo cp gtsr1.pem /usr/local/share/ca-certificates/ # 更新系统证书缓存 sudo update-ca-certificates
完成后再次测试openssl s_client -connect storage.googleapis.com:443。
4. 检查系统时间是否同步
证书验证对系统时间的准确性要求很高,如果系统时间和实际时间偏差过大(比如超过证书的有效期范围),也会触发验证失败。检查当前时间:
date
如果时间不正确,开启NTP同步:
sudo timedatectl set-ntp true
等待时间同步完成后再测试。
内容的提问来源于stack exchange,提问作者lulliezy
相关产品推荐
相关产品推荐

