You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 01:55:30