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

Windows环境下Python SSL/TCP套接字证书验证失败问题求助

解决Python SSL客户端证书验证失败:unable to get local issuer certificate

问题核心

你的客户端报错ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate,本质是客户端无法找到信任的证书颁发机构(CA)来验证服务器证书的合法性,哪怕你把证书装到Windows根存储、修改certifi的cacert.pem,都可能因为证书链不完整或Python SSL上下文配置问题导致验证失败。

具体解决步骤

1. 确认证书链完整性

你当前客户端加载的cert.pem大概率只是服务器端证书,没有包含颁发它的根CA证书(以及中间CA证书,如果有的话)。SSL验证需要完整的证书链才能回溯到信任的根CA。

  • 操作:找到生成证书时的根CA证书(比如root_ca.pem),把服务器证书和根CA证书合并成一个完整的PEM文件:
    # Windows命令行合并(假设cert.pem是服务器证书,root_ca.pem是根CA证书)
    type root_ca.pem >> full_chain.pem
    type cert.pem >> full_chain.pem
    
  • 修改客户端代码,加载完整链文件:
    context.load_verify_locations("full_chain.pem")
    

2. 让Python SSL上下文自动使用Windows根证书存储

Python的ssl.SSLContext默认不会自动加载Windows系统根证书存储里的证书,你可以改用ssl.create_default_context(),它会自动导入系统信任的根证书(包括你安装的cer格式证书):

  • 客户端代码修改:
    # 替换原来手动创建SSLContext的代码
    context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
    context.check_hostname = True
    # 不需要手动load_verify_locations,默认用系统根存储
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    ssock = context.wrap_socket(sock, server_hostname=server_ip)
    
    这样如果你的根CA证书已经正确安装到Windows根证书存储(本地计算机->受信任的根证书颁发机构),Python会自动找到它来验证服务器证书。

3. 检查证书的主机名匹配

你的客户端用server_hostname=server_ip,需要确保服务器证书的主题备用名称(SAN)字段包含这个IP地址,或者证书的通用名称(CN)就是这个IP。如果证书的CN是域名但你用IP连接,check_hostname=True会导致验证失败(不过这时候报错会是hostname不匹配,但也要排除这个情况)。

  • 用OpenSSL命令查看证书的SAN和CN:
    openssl x509 -in cert.pem -text -noout | findstr /i "Subject: DNS:"
    openssl x509 -in cert.pem -text -noout | findstr /i "Subject: CN="
    

4. 用OpenSSL命令行验证证书链

先排除代码问题,用OpenSSL工具直接测试服务器证书是否能被客户端信任:

openssl s_client -connect <你的服务器IP>:<端口> -CAfile full_chain.pem

如果输出最后出现Verify return code: 0 (ok),说明证书链没问题,问题出在Python代码的配置;如果还是报错,说明证书本身的链不完整,需要重新生成包含完整链的证书文件。

额外注意点

  • 不要随便关闭context.verify_mode = ssl.CERT_REQUIRED,这会完全失去SSL的服务器认证能力,等于裸奔。
  • 如果你用的是内部CA签发的证书,必须确保客户端信任这个CA的根证书,要么通过加载完整链,要么通过系统根存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 03:15:46