执行curl请求遇schannel证书信任错误及客户端证书自动使用禁用问题
问题描述
执行以下命令获取目标站点证书并保存为cacert.pem:
echo quit | openssl s_client -showcerts -servername xxx.xxx.xxx -connect xxx.xxx.xxx:443 > cacert.pem
随后执行curl POST请求:
def response = sh """curl --cacert cacert.pem -v -d '{....}' -H "Content-Type:application/x-www-form-urlencoded" -X POST url"""
执行后触发以下错误:
schannel: disabled automatic use of client certificate
- ALPN: offers http/1.1
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0* schannel: added 2 certificate(s) from CA file 'cacert.pem' - schannel: CertGetCertificateChain trust error CERT_TRUST_IS_UNTRUSTED_ROOT
0 0 0 0 0 0 0 0 --:--:-- 0:00:01 --:--:-- 0 - Closing connection 0
curl: (60) schannel: CertGetCertificateChain trust error CERT_TRUST_IS_UNTRUSTED_ROOT
解决办法
1. 清理证书文件冗余内容
openssl s_client导出的cacert.pem可能包含命令输出的无关文本,手动编辑文件,只保留所有从-----BEGIN CERTIFICATE-----到-----END CERTIFICATE-----的证书块,删除其他多余内容。
2. 适配schannel的证书格式或导入系统信任
Schannel(Windows下curl默认安全后端)对证书格式和系统信任链依赖更强:
- 将PEM证书转换为DER格式:
openssl x509 -in cacert.pem -out cacert.cer -outform der
- 双击
cacert.cer,按向导将证书导入受信任的根证书颁发机构存储,之后curl请求无需指定--cacert参数,schannel会自动读取系统信任的证书。
3. 强制curl使用OpenSSL后端
如果是Windows环境,可指定curl切换到OpenSSL后端,避免schannel的信任校验逻辑:
curl --ssl-backend openssl --cacert cacert.pem -v -d '{....}' -H "Content-Type:application/x-www-form-urlencoded" -X POST url
4. 确认证书链完整性
检查导出的证书是否包含完整信任链(根CA+中间CA),用以下命令查看证书详情:
openssl s_client -showcerts -servername xxx.xxx.xxx -connect xxx.xxx.xxx:443 | openssl x509 -text -noout
确保所有必要的证书节点都被保存到cacert.pem中。
内容的提问来源于stack exchange,提问作者Kannan TK
相关产品推荐
相关产品推荐

