簡體   English   中英

imaplib和poplib python的證書頒發機構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM