imaplib和poplib python的证书颁发机构

时间:2012-03-15 02:09:19

标签: python imaplib poplib

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

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

感谢。

4 个答案:

答案 0 :(得分:2)

快速检查 imaplib.py 表明它使用ssl.wrap_socket()来实现IMAP_SSL()调用。对wrap_socket()调用的调用仅提供3个参数,并且不传递所需参数 ca_cert ,这是验证CA所需的参数。

您可以从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')

答案 1 :(得分:1)

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

如果您正在安装已安装Mozilla / Firefox的系统,则可能会正确设置证书存储区。但事实并非如此,你要努力争取让它正常工作几天。

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

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

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

答案 2 :(得分:1)

因为从IMAP调用了IMAP4SSL.open。 init ,上面的解决方案没有帮助,因为用户没有调用open()。 您可以覆盖IMAP。 init 到...

简短:仅扩展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

答案 3 :(得分: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:我想把它添加为评论,但代码是为了评论。