Imaplib和poplib python的证书颁发机构
题
我正在使用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 /#验证系统
工作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:我想将其添加为注释,但代码需要注释。