使用Python建立TLS连接时遭遇SSL证书验证失败求助
解决Python TLS连接中的SSL证书验证错误
错误原因
ssl.SSLCertVerificationError 出现的核心原因是Python的SSL上下文无法找到可信的根证书,完成服务器证书的链验证。可能是系统默认根证书未被正确加载,或者服务器使用的是自签名/私有CA签发的证书。
解决方案
1. 加载系统默认根证书
大多数场景下,显式加载系统默认的服务器验证根证书即可解决问题:
import socket import ssl import json from ArgumentParser import Parser argParser = Parser() # just handles command line arg parsing clientSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) # 显式加载系统默认的服务器验证根证书 context.load_default_certs(purpose=ssl.Purpose.SERVER_AUTH) clientSock = context.wrap_socket( sock=clientSock, server_hostname=argParser.hostName, ) clientSock.connect((argParser.hostName, argParser.portNum))
2. 使用自定义CA证书(针对自签名/私有CA场景)
如果服务器证书由私有CA或自签名生成,需要将CA证书文件加载到SSL上下文:
import socket import ssl import json from ArgumentParser import Parser argParser = Parser() # just handles command line arg parsing clientSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) # 替换为你的CA证书实际路径 context.load_verify_locations('/path/to/your/ca-certificate.crt') clientSock = context.wrap_socket( sock=clientSock, server_hostname=argParser.hostName, ) clientSock.connect((argParser.hostName, argParser.portNum))
3. 临时跳过验证(仅测试环境使用)
警告:此操作会关闭证书验证与主机名检查,存在严重安全风险,绝对禁止在生产环境使用
import socket import ssl import json from ArgumentParser import Parser argParser = Parser() # just handles command line arg parsing clientSock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) # 禁用证书验证和主机名检查 context.check_hostname = False context.verify_mode = ssl.CERT_NONE clientSock = context.wrap_socket( sock=clientSock, server_hostname=argParser.hostName, ) clientSock.connect((argParser.hostName, argParser.portNum))
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

