2

我正在使用 imaplib 和 poplib 使用 IMAPS 和 POP3S 执行电子邮件收集,以实现安全连接。但据我所知,这两个库都没有使用 CA 来确认收到的证书的有效性。这是真的吗?如果是,是否可以将 imaplib 或 poplib 设置为使用 CA?

如果这不是真的并且他们确实使用 CA,有人可以告诉我 imaplib/poplib 是如何做到的吗?

谢谢。

4

4 回答 4

2

对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-15T17:24:37.123 回答
1

我又想到了一个想法。python ssl 库构建在 OpenSSL 之上。如果您要开始要求服务器提供证书并且它们是有效的,那么您将很快遇到与证书存储相关的各种 Unix 版本的问题。

如果您碰巧在一个已经安装了 Mozilla/Firefox 的系统上工作,那么证书存储可能会正确设置。但事实并非如此,您将努力几天才能使其正常工作。

这个链接极大地帮助了我们:http: //www.madboa.com/geek/openssl/

特别注意这个链接: http: //www.madboa.com/geek/openssl/#verify-system

任何使用 openssl 工作的开发人员都应该为该站点添加书签。这有点简洁,但每一个条目都值得它的黄金重量!

于 2012-03-22T15:05:45.960 回答
1

因为 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
于 2012-04-25T10:02:43.007 回答
0

我目前正在朝这个方向构建一些东西。

以下代码添加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:我想将其添加为评论,但代码渴望评论。

于 2012-04-25T14:56:38.123 回答