2012-03-15 22 views
2

私はimaplibとpoplibを使って、安全な接続のためにIMAPSとPOP3Sを使って電子メールを収集しています。しかし、私が決定したことから、どちらの図書館も、受信した証明書の有効性を確認するためにCAを使用していません。これは本当ですか?そうであれば、CAを使用するようにimaplibまたはpoplibを設定することは可能ですか?imaplibとpoplib pythonの認証局

真実ではなく、CAを使用している場合、誰かがimaplib/poplibでどのようにしているのか教えてください。

ありがとうございました。

答えて

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') 
+0

ありがとうございました。私はPythonに慣れていないので、あなたの提案を正しく理解していることを確認するだけです。 imaplibのssl.wrap_socket()をオーバーライドして、 "cert_reqs"パラメータを設定できるようにしたい(たとえば、 "CERT_REQUIRED"に設定)、CAを含むファイルを指すように "ca_certs"を設定しますか?私が正しく理解していることを確認しても問題はありません:) – user788462

+0

'cert_reqs'を指定するかどうかはわかりません(可能ですが、paramが微妙に異なる問題に対処しています) 。クライアント側に証明書を提供するようサーバーに要求し、証明書が有効であることを伝えます。間違いなく、これは良いことです。両側が同意すると確信していれば、もっと一般的に有用なものを考えているなら、この前提は失われるかもしれません。 – user590028

+0

'self.certificate'のように見えるのは' self.certfile'に置き換えて動作させる必要があります。 – kasperd

1

。 python sslライブラリはOpenSSLの上に構築されています。サーバーが証明書を提供する必要があり、証明書が有効であれば、証明書ストアに関連するさまざまな種類のUnixの問題に素早く移行します。

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

このリンクは非常に私たちを助けた:http://www.madboa.com/geek/openssl/

は特に、このリンクに注意を払うます。openssl/wの作業http://www.madboa.com/geek/openssl/#verify-system

任意の開発者がそのサイトをブックマークする必要があります。それは控えめな側のビットですが、すべての単一のエントリは、金の重さの価値がある!

+0

もう一度お手伝いをしていただきありがとうございます。私は、私が扱っているものを完全に理解するために、それらの文書を徹底的に読んでいきます。私はいくつかの追加ビットで述べたクラスを実装しました。 - cert_reqs = CERT_REQUIRED、ca_certs = '/ etc /.../ ca-bundle.crt'をdefを追加してself.sslobjに渡します。また、必要なSSLビットをインポートし、 "imaplib.IMAP4_SSL = IMAP4_SSL_CA_CHECKER"を設定しました。 – user788462

+0

正しいことをしているようですが、今すぐ "SSLError:[Errno 1] _ssl.c:503:error:14090086:SSLルーチン:SSL3_GET_SERVER_CERTIFICATE:証明書の検証に失敗しました"というメッセージが表示されます。だから私のコードは私のDovecotサーバーから証明書を受け入れることに対処する必要があるように見えます。 OpenSSLの読み込みを開始する時間:) – user788462

1

IMAPからIMAP4SSL.openが呼び出されるためです。 上記の解決策は役に立ちません。ユーザーがopen()を呼び出さないためです。 IMAPを上書きできます。 init to ...

短い: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 
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:これをコメントとして追加したいと思いますが、コードは長い間コメントになりました。

関連する問題