在Python中关闭M2Crypto的SSL检查

1 投票
2 回答
1635 浏览
提问于 2025-04-15 19:41

有没有办法关闭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模块检查主机名。

撰写回答