如何使用Python创建SSL Socket服务器及SSL证书报错排查
SSL Socket服务报错解答
跨服务器使用现有SSL文件的可行性
从其他站点获取的SSL文件可以在新服务器使用,需满足三个前提:
- 证书
cert.crt的通用名称(CN)或主题备用名称(SAN)字段,包含新服务器的访问域名或公网IP - 私钥
key.key与证书cert.crt匹配,且未被篡改 - 访问服务的客户端已将
ca.pem导入信任根证书列表,否则会触发证书不信任错误
本次报错的核心原因
SSLV3_ALERT_CERTIFICATE_UNKNOWN是TLS握手阶段对端返回的证书校验失败告警,结合你的代码配置,触发原因包括:
- 客户端校验服务端证书失败
新服务器的访问地址不在cert.crt的有效范围内,或客户端未信任ca.pem,客户端校验不通过主动断开连接,返回该告警。 - 服务端校验客户端证书失败
你的代码中设置了cert_reqs=ssl.CERT_REQUIRED,强制要求客户端提交证书,并用ca.pem校验合法性,以下情况都会触发错误:
- 客户端握手时未提交有效证书
- 客户端提交的证书不是当前
ca.pem签发的 - 客户端证书的通用名称不是
DemoClt,或证书处于未生效/已过期状态
- 本地证书文件异常
cert.crt和key.key不匹配,无法完成服务端身份校验ca.pem文件缺失根证书或中间证书,无法完成完整的证书链校验
排查方案
- 验证证书与私钥是否匹配,执行以下两条命令,输出哈希值一致则匹配:
openssl x509 -noout -modulus -in cert.crt | openssl md5 openssl rsa -noout -modulus -in key.key | openssl md5
- 检查证书的有效地址是否包含当前服务器的访问地址:
openssl x509 -in cert.crt -text -noout | grep -E 'Subject:|DNS:|IP Address:'
- 测试时可临时将
cert_reqs参数改为ssl.CERT_NONE,如果不再报错说明问题出在客户端证书校验环节,优先排查客户端证书配置即可。
额外提示:你的代码中使用了
time.time()但未导入time模块,修复SSL问题后需要补充导入,否则会触发名称错误。另外ssl.wrap_socket方法在Python3.7及以上版本已被弃用,推荐使用SSLContext类实现SSL包装,兼容性更好。
内容的提问来源于stack exchange,提问作者Mahdi Khezrabadi
相关产品推荐
相关产品推荐

