我正在使用imaplib和poplib来执行电子邮件收集,使用IMAPS和POP3S来实现安全连接。但根据我所能确定的,这两个库都没有使用CA来确认接收到的证书的有效性。这是真的吗?如果是,是否可以将imaplib或poplib设置为使用CA?
如果这不是真的,他们确实使用了CA,有人能告诉我imaplib/poplib是如何做到的吗?
谢谢。
发布于 2012-03-16 01:24:37
快速检查一下imaplib.py,就会发现它使用ssl.wrap_socket()来实现IMAP_SSL()调用。对wrap_socket()的调用只提供了3个参数,并且没有传递验证CA所需的参数ca_cert。
您可以从IMAP4_SSL继承,并覆盖open()方法以传入所需的ca_cert。有关更多信息,请查看http://docs.python.org/library/ssl.html。
可能是这样的:
class IMAP4_SSL_CA_CHECKER(IMAP4_SSL):
def open(self, host = '', port = IMAP4_SSL_PORT, ca_certs = None):
self.host = host
self.port = port
self.sock = socket.create_connection((host, port))
self.sslobj = ssl.wrap_socket(self.sock, self.keyfile,
self.certificate, ca_certs=ca_certs)
self.file = self.sslobj.makefile('rb')发布于 2012-03-22 23:05:46
我又想到了一个要提的想法。python ssl库构建在OpenSSL之上。如果您打算开始要求服务器提供证书并且这些证书是有效的,那么您很快就会遇到与证书存储相关的各种Unix版本的问题。
如果您碰巧在已经安装了Mozilla/Firefox的系统上工作,证书存储很可能设置正确。但事实并非如此,你需要花几天的时间才能让它正常工作。
这个链接给了我们很大的帮助:http://www.madboa.com/geek/openssl/
特别要注意这个链接:http://www.madboa.com/geek/openssl/#verify-system
任何使用openssl的开发人员都应该将该站点加入书签。这有点简洁明了,但每一篇文章都是值得的!
发布于 2012-04-25 18:02:43
因为IMAP4SSL.open是从IMAP.init调用的,所以上面的解决方案没有帮助,因为用户没有调用IMAP4SSL.open()。您可以覆盖IMAP。初始化到...
简而言之:只扩展open()的参数是不够的。
我使用了注入:
def IMAP4SSL_open(self, host = '', port = imaplib.IMAP4_SSL_PORT):
... own implementation ...
wrap_socket( ... cert_reqs=ssl.CERT_REQUIRED ... )
imaplib.IMAP4_SSL.__dict__['open']=IMAP4SSL_openhttps://stackoverflow.com/questions/9713055
复制相似问题