2

imaplibとpoplibを使用して、安全な接続のためにIMAPSとPOP3Sを使用して電子メールの収集を実行しています。しかし、私が判断できたことから、どちらのライブラリもCAを使用して受け取った証明書の有効性を確認していません。これは本当ですか?もしそうなら、CAを使用するようにimaplibまたはpoplibを設定することは可能ですか?

それが真実ではなく、彼らがCAを使用している場合、誰かがimaplib / poplibがそれをどのように行うか教えてもらえますか?

ありがとう。

4

4 に答える 4

2

imaplib.pyを簡単に確認すると、ssl.wrap_socket() を使用して IMAP_SSL() 呼び出しが実装されていることがわかります。wrap_socket() 呼び出しの呼び出しは 3 つのパラメーターのみを提供し、CA を検証するために必要な必須パラメーターca_certを渡しません。

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')
于 2012-03-15T17:24:37.123 に答える
1

言及するもう1つの考えが思い浮かびました。python ssl ライブラリは、OpenSSL の上に構築されています。サーバーに証明書を提供し、それらが有効であることを要求し始めると、証明書ストアに関連する Unix のさまざまなフレーバーの問題にすぐに遭遇します。

Mozilla/Firefox が既にインストールされているシステムで作業している場合は、証明書ストアが正しく設定されている可能性があります。しかし、そうではありません。これを正しく機能させるために、数日間苦労することになります。

このリンクは非常に役立ちました: http://www.madboa.com/geek/openssl/

特にこのリンクに注意してください: http://www.madboa.com/geek/openssl/#verify-system

openssl を使用する開発者は、そのサイトをブックマークする必要があります。少し簡潔ですが、すべてのエントリは金の重さの価値があります!

于 2012-03-22T15:05:45.960 に答える
1

IMAP4SSL.open は IMAP から呼び出されるためです。ユーザーが open() を呼び出さないため、上記のソリューションをinitしても役に立ちません。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
于 2012-04-25T10:02:43.007 に答える
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: これをコメントとして追加したかったのですが、コードにコメントが必要でした。

于 2012-04-25T14:56:38.123 に答える