Python3.10 SSL证书验证失败(SSLV3_ALERT_HANDSHAKE_FAILURE)求助
我的脚本在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

