在Python中关闭M2Crypto的SSL检查
有没有办法关闭SSL检查,这样在使用SOAPpy库时就不会出现错误主机异常?
2 个回答
0
在AndiDog的回答基础上,你可以针对每个实例单独设置postConnectionCheck。在M2Crypto的版本0.21.1(至少这个版本)中,有一个叫做Connect.set_post_connection_check_callback()
的方法可以做到这一点:
sslsock = M2Crypto.SSL.Connection(sslcontext)
# Disable checking of server certificates
sslsock.set_post_connection_check_callback(None)
需要注意的是,这个设置会同时禁用对连接服务器和接受客户端的检查(后者默认是禁用的)。
这个参数如果不为None,就是一个函数,它需要接收一个证书和一个地址,也就是:
check(self.get_peer_cert(), self.addr[0])
如果想了解更多,可以参考这个M2Crypto的源代码。
5
你可以这样在M2Crypto中关闭所有的对等证书检查:
from M2Crypto import SSL, httpslib
context = SSL.Context("sslv3")
# Disable certificate checking
context.set_verify(0, depth = 0)
connection = httpslib.HTTPSConnection("somehostname", 443, ssl_context=context)
# Hack (!!!) for disabling host name check <CN> == <expected host name>.
# Will affect any future SSL connections made by M2Crypto!
SSL.Connection.postConnectionCheck = None
connection.connect() # <-- this would normally raise SSL verification errors
connection.request("GET", "/")
...
我希望你明白,这样做基本上是关闭了通过M2Crypto建立的任何SSL连接的安全性。所以这并不是一个推荐的做法,除非你只和一个服务器通信,并且认为中间人攻击的风险比使用未加密的HTTP更能接受。
关于M2Crypto的解决方案就到这里,但因为你的问题(与标题不同)提到了SOAPpy(我还没用过),所以解决方案可能会有所不同,因为SOAPpy的配置似乎使用的是socket
模块,而不是M2Crypto.SSL
(见第132行)。我不知道如何防止socket.ssl
模块检查主机名。