[英]Certificate Authority for imaplib and 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/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')
因為從IMAP調用了IMAP4SSL.open。 初始化上面的解決方案沒有幫助,因為用戶沒有調用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
我想到了另一種想法。 python ssl庫建立在OpenSSL之上。 如果您開始要求服務器提供證書並且證書有效,那么您將很快遇到各種與證書存儲相關的Unix問題。
如果您恰巧在已安裝Mozilla / Firefox的系統上工作,則證書存儲可能會正確設置。 但事實並非如此,您要努力幾天才能使它正常工作。
該鏈接極大地幫助了我們: http : //www.madboa.com/geek/openssl/
特別注意此鏈接: http : //www.madboa.com/geek/openssl/#verify-system
使用openssl的任何開發人員都應將該站點添加為書簽。 這有點簡潔,但是每一個條目都是值得的!
我目前正在朝這個方向發展。
以下代碼將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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.