You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

curl错误35(schannel):SSL/TLS握手失败的原因及排查方法咨询

解析curl schannel握手失败错误(代码35)

我来帮你拆解这个curl遇到的SSL/TLS握手问题——这个curl: (35) schannel: failed to receive handshake, SSL/TLS connection failed错误,本质上是Windows平台下curl默认使用的Schannel SSL/TLS库,在与目标服务器建立加密连接的握手阶段,没能成功接收来自服务器的响应数据,导致连接中断。下面分两部分帮你理清可能的根源,以及怎么获取更详细的调试信息:

错误的可能根源

Schannel是Windows系统自带的SSL/TLS实现,这个握手失败的问题可能来自客户端或服务器端的多个环节:

  • 服务器端问题

    • TLS版本不兼容:服务器可能只支持较新的TLS 1.3,而你的curl配置的Schannel默认未启用该版本;或者反过来,服务器仅支持旧版TLS(如1.0/1.1),而系统Schannel已禁用这些不安全的版本。
    • 证书异常:服务器的SSL证书过期、域名不匹配、未被信任的CA签发,或者证书链不完整,都会导致Schannel拒绝完成握手。
    • 服务器端拦截:服务器的防火墙、WAF或安全组可能拦截了握手阶段的数据包,或者服务器负载过高无法处理请求。
  • 客户端问题

    • 本地证书/密钥问题:你指定的some_key_file.keycertificate_file.pem可能格式不兼容Schannel(比如Schannel对PEM格式的支持有限,可能需要转换成PFX格式)、密钥与证书不配对,或者文件权限不足导致Schannel无法读取。
    • Schannel配置限制:系统组策略可能禁用了必要的加密套件或TLS版本,导致无法与服务器协商出兼容的加密方式。
    • 本地网络拦截:本地防火墙、杀毒软件或代理服务器可能拦截了HTTPS流量,中断了握手过程。
    • 根证书缺失:你的Windows系统根证书存储中,缺少服务器证书对应的根CA证书,导致Schannel无法验证服务器证书的合法性。

如何获取更详细的错误信息

要定位具体问题,你可以通过以下方法获取更细致的调试日志:

  • 启用Schannel详细日志
    在Windows命令行中先设置环境变量,再运行curl命令:

    set SCHANNEL_LOG_LEVEL=0x000F
    curl -v --key some_key_file.key --cert certificate_file.pem --show-error --header "Content-Type: application/json;charset=UTF-8" https://some-api/service
    

    这个环境变量会让Schannel输出最详细的握手过程日志,包括协商的TLS版本、加密套件、证书验证步骤等,能帮你定位到握手失败的具体环节。

  • 指定TLS版本排查兼容性
    尝试强制curl使用特定TLS版本,比如:

    curl -v --tlsv1.2 --key some_key_file.key --cert certificate_file.pem --show-error --header "Content-Type: application/json;charset=UTF-8" https://some-api/service
    

    或者换成--tlsv1.3,如果某个版本能成功,说明是TLS版本不兼容的问题。

  • 验证本地证书和密钥的有效性
    用OpenSSL工具检查证书和密钥:

    • 查看证书详情,确认有效期、域名匹配:
      openssl x509 -in certificate_file.pem -text -noout
      
    • 检查密钥是否有效:
      openssl rsa -in some_key_file.key -check
      
    • 验证密钥与证书是否配对:分别提取两者的模数值,对比是否一致:
      openssl x509 -noout -modulus -in certificate_file.pem
      openssl rsa -noout -modulus -in some_key_file.key
      
  • 查看Windows事件日志
    打开Windows的「事件查看器」,导航到「Windows日志 -> 应用程序」,查找来源为Schannel的事件,里面会包含更具体的错误代码和描述,比如证书验证失败的具体原因。

  • 临时跳过证书验证(仅调试用)
    加上--insecure参数运行curl,如果能成功连接,说明问题出在证书信任环节:

    curl -v --insecure --key some_key_file.key --cert certificate_file.pem --show-error --header "Content-Type: application/json;charset=UTF-8" https://some-api/service
    

    注意:这个参数会跳过证书验证,绝对不要在生产环境使用

内容的提问来源于stack exchange,提问作者Lucas Charbonnier

火山引擎 最新活动