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

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

谢谢.

有帮助吗?

解决方案

快速检查 imaplib.py 显示它使用ssl.wrap_socket()来实现IMAP_SSL()调用。对Wrap_socket()调用的调用仅提供3个参数,并且不会通过所需的参数 ca_cert ,这就是验证CA所需的方式。

您可以从IMAP4_SSL继承,并覆盖Open()方法以传递所需的 ca_cert 。签出 http://docs.python.org/library/sl.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的系统上工作,则可以正确设置CERT存储。但它没有,你会挣扎几天试图让它正常工作。

此链接帮助我们非常普遍: http://www.madboa.com/geek/openssl/

特别注意此链接: http://www.madboa.com/geek / openssl /#验证系统

工作w / openssl的开发人员应该为该网站添加书签。这是一个必要的一面,但每次入场都值得这一点是金色的重量!

因为从IMAP调用imap4ssl.open。 init 上面的解决方案无帮助,因为用户不调用打开()。 您可以覆盖IMAP。 init to ...

short:仅扩展仅打开()的参数是不够的。

我用注射:

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:我想将其添加为注释,但代码需要注释。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top