imaplibとpoplibを使用して、安全な接続のためにIMAPSとPOP3Sを使用して電子メールの収集を実行しています。しかし、私が判断できたことから、どちらのライブラリもCAを使用して受け取った証明書の有効性を確認していません。これは本当ですか?もしそうなら、CAを使用するようにimaplibまたはpoplibを設定することは可能ですか?
それが真実ではなく、彼らがCAを使用している場合、誰かがimaplib / poplibがそれをどのように行うか教えてもらえますか?
ありがとう。
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')
言及するもう1つの考えが思い浮かびました。python ssl ライブラリは、OpenSSL の上に構築されています。サーバーに証明書を提供し、それらが有効であることを要求し始めると、証明書ストアに関連する Unix のさまざまなフレーバーの問題にすぐに遭遇します。
Mozilla/Firefox が既にインストールされているシステムで作業している場合は、証明書ストアが正しく設定されている可能性があります。しかし、そうではありません。これを正しく機能させるために、数日間苦労することになります。
このリンクは非常に役立ちました: http://www.madboa.com/geek/openssl/
特にこのリンクに注意してください: http://www.madboa.com/geek/openssl/#verify-system
openssl を使用する開発者は、そのサイトをブックマークする必要があります。少し簡潔ですが、すべてのエントリは金の重さの価値があります!
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
私は現在、この方向で何かを構築しています。
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: これをコメントとして追加したかったのですが、コードにコメントが必要でした。