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

Python3.10 SSL证书验证失败(SSLV3_ALERT_HANDSHAKE_FAILURE)求助

Python3.10 SSL证书验证失败问题排查与解决

我的脚本在Python3.7中运行正常,但在Python3.10中出现SSL: CERTIFICATE_VERIFY_FAILED错误。尝试设置SSL_CERT_FILE和SSL_CERT_DIR环境变量后仍未解决问题。

Python3.7 默认SSL验证路径

$ python3.7 -c "import ssl; print(ssl.get_default_verify_paths())"
DefaultVerifyPaths(cafile='/etc/pki/tls/cert.pem', capath='/etc/pki/tls/certs',openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/etc/pki/tls/cert.pem',openssl_capath_env='SSL_CERT_DIR', openssl_capath='/etc/pki/tls/certs')

Python3.10 默认SSL验证路径(运行失败)

$ python3.10 -c "import ssl; print(ssl.get_default_verify_paths())"
DefaultVerifyPaths(cafile=None, capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/opt/puppetlabs/puppet/ssl/cert.pem',openssl_capath_env='SSL_CERT_DIR', openssl_capath='/opt/puppetlabs/puppet/ssl/certs')

已尝试的配置

我在脚本中添加以下代码设置环境变量:

os.environ["REQUESTS_CA_BUNDLE"] = '/etc/pki/tls/cert.pem'
os.environ["SSL_CERT_FILE"] = '/etc/pki/tls/cert.pem'
os.environ["SSL_CERT_DIR"] = '/etc/pki/tls/certs'

执行后ssl.get_default_verify_paths()输出如下,但仍出现[SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:997)错误:

DefaultVerifyPaths(cafile='/etc/pki/tls/cert.pem', capath='/etc/pki/tls/certs', openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/opt/puppetlabs/puppet/ssl/cert.pem',openssl_capath_env='SSL_CERT_DIR', openssl_capath='/opt/puppetlabs/puppet/ssl/certs')

解决建议

  • 检查OpenSSL版本差异
    运行python3.10 -c "import ssl; print(ssl.OPENSSL_VERSION)"和Python3.7的对应输出对比,确认是否因OpenSSL版本差异导致证书兼容性问题。

  • 强制在SSL上下文指定CA证书
    如果环境变量不生效,可直接在代码中给SSL上下文指定CA文件。以requests库为例:

    import requests
    from ssl import SSLContext
    
    ctx = SSLContext()
    ctx.load_verify_locations('/etc/pki/tls/cert.pem')
    response = requests.get('目标URL', verify=ctx)
    

    原生urllib可采用类似方式配置SSL上下文。

  • 验证证书链有效性
    使用openssl s_client -connect 目标域名:端口 -CAfile /etc/pki/tls/cert.pem测试证书链是否完整,确认/etc/pki/tls/cert.pem包含目标服务器所需的根证书或中间证书。

  • 重新编译Python3.10指定标准OpenSSL路径
    若Python3.10为自定义编译,可能是编译时链接了Puppet的OpenSSL库。重新编译时指定系统标准OpenSSL路径:

    ./configure --with-openssl=/usr --with-openssl-rpath=no
    make && make install
    

内容的提问来源于stack exchange,提问作者Ravi M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 15:33:27