Python调用wrap_socket出现ca_certs意外关键字参数错误怎么解决
问题原因及解答
你遇到的报错并非Python版本缺陷,属于对SSLContext.wrap_socket()方法的参数调用逻辑错误:
ca_certs、cert_reqs、certfile、keyfile均是ssl模块顶层便捷函数ssl.wrap_socket()的专属参数,SSLContext实例的wrap_socket()方法从Python 3.6版本开始就不支持上述参数,所有证书、验证规则相关配置需要提前在SSLContext实例上完成,不能在调用wrap_socket时传入。- 原有代码还存在配置逻辑错误:
ca.key是CA的私钥文件,不能作为信任根证书传入,根证书需要使用pem格式的CA公钥证书文件,也就是修复代码中用到的ca.pem。
正确的客户端TLS配置逻辑
如果需要实现「客户端验证服务端证书+客户端向服务端出示自身证书」的双向验证,配置步骤如下:
- 创建SSLContext实例
- 调用
context.load_verify_locations("ca.pem")配置信任的根CA证书,替代原ca_certs参数的作用 - 配置
context.verify_mode = ssl.CERT_REQUIRED开启服务端证书强制校验,替代原cert_reqs参数的作用 - 调用
context.load_cert_chain(certfile="client.pem", keyfile="client.key")加载客户端自身的证书和私钥,替代原certfile、keyfile参数的作用 - 调用
wrap_socket时仅需传入socket对象和server_hostname参数即可
你最终修复后的代码符合上述配置逻辑,所有证书相关配置提前在context实例上完成,wrap_socket仅传入支持的参数,因此可以正常运行。
内容的提问来源于stack exchange,提问作者Pasan W.
相关产品推荐
相关产品推荐

