我正在使用imaplib和poplib来使用IMAPS和POP3S进行电子邮件收集以实现安全连接。但是根据我的判断,两个库都没有使用CA来确认收到的证书的有效性。这是真的吗?如果是,是否可以将imaplib或poplib设置为使用CA?
如果不是这样且他们确实使用了CA,有人可以告诉我imaplib / poplib是如何做到的吗?
感谢。
答案 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:我想把它添加为评论,但代码是为了评论。