我正在使用 imaplib 和 poplib 使用 IMAPS 和 POP3S 执行电子邮件收集,以实现安全连接。但据我所知,这两个库都没有使用 CA 来确认收到的证书的有效性。这是真的吗?如果是,是否可以将 imaplib 或 poplib 设置为使用 CA?
如果这不是真的并且他们确实使用 CA,有人可以告诉我 imaplib/poplib 是如何做到的吗?
谢谢。
对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')
我又想到了一个想法。python ssl 库构建在 OpenSSL 之上。如果您要开始要求服务器提供证书并且它们是有效的,那么您将很快遇到与证书存储相关的各种 Unix 版本的问题。
如果您碰巧在一个已经安装了 Mozilla/Firefox 的系统上工作,那么证书存储可能会正确设置。但事实并非如此,您将努力几天才能使其正常工作。
这个链接极大地帮助了我们:http: //www.madboa.com/geek/openssl/
特别注意这个链接: http: //www.madboa.com/geek/openssl/#verify-system
任何使用 openssl 工作的开发人员都应该为该站点添加书签。这有点简洁,但每一个条目都值得它的黄金重量!
因为 IMAP4SSL.open 是从 IMAP 调用的。init上面的解决方案没有帮助,因为用户没有调用 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_open
我目前正在朝这个方向构建一些东西。
以下代码添加starttls
到 IMAP。只需server.starttls()
在连接后调用。请务必连接到正常的 IMAP 端口。
import imaplib,ssl
def IMAP_starttls(self, keyfile=None, certfile=None,cert_reqs=ssl.CERT_NONE,ca_certs=None):
if not 'STARTTLS' in self.capabilities:
raise self.error("STARTTLS extension not supported by server.")
(resp, reply) = self._simple_command("STARTTLS")
self.sock = ssl.wrap_socket(self.sock, keyfile, certfile,cert_reqs=cert_reqs,ca_certs=ca_certs)
self.file = self.sock.makefile('rb')
imaplib.IMAP4.__dict__['starttls']=IMAP_starttls
imaplib.Commands['STARTTLS']=('NONAUTH',)
PS:我想将其添加为评论,但代码渴望评论。