2017-06-03 19 views
0

セキュアソケットを使用してgmail SMTPサーバーに接続したいとします。私はmail.google.com.crtの証明書ファイルをFirefox(私は単にgmail.comページを開いて、私のブラウザエクスポート証明書ボタンを使って証明書をエクスポートした)を使ってダウンロードしました。ssl.SSLError:[SSL:CERTIFICATE_VERIFY_FAILED]証明書の検証に失敗しました。Pythonソケット、ssl、gmail smtp connect

しかし、問題があるように見えますが、その理由はわかりません。私がmail.google.com.crtGeoTrustGlobalCA.pemに変更したとき(私はそれをどこかオンラインで見つけました)、それはうまくいった(エラーを表示しませんでした)。私はここで何かを理解していないのですか?

if __name__ == '__main__': 

    HOST = 'smtp.gmail.com' 
    PORT = 465 

    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    sock.connect((HOST, PORT)) 

    context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) 
    context.verify_mode = ssl.CERT_REQUIRED 
    context.load_verify_locations('mail.google.com.crt') 

    # check SNI extension 
    if ssl.HAS_SNI: 
     secure_sock = context.wrap_socket(sock, server_hostname=HOST) 
    else: 
     secure_sock = context.wrap_socket(sock) 

    cert = secure_sock.getpeercert() 
    print cert 

    if not cert or ('commonName', 'smtp.google.com') not in cert['subject'][4]: raise Exception("erroe") 

    secure_sock.recv(1024) 

    secure_sock.close() 
    sock.close() 

答えて

1
context.load_verify_locations('mail.google.com.crt') 

場所は、信頼できるCA証明書を含むことが期待されていることを確認します。指定したサーバ証明書はCA証明書ではありません。 documentationから:

Load a set of “certification authority” (CA) certificates used to validate other peers’ certificates ...

+0

よろしくお願いいたします。だから、この証明書だけが信頼されているので、私は常に(最初から最後まで)証明書をエクスポートすべきですか? – yak

+0

私自身のCAを構築したいと思うなら、これはうまくいかないでしょうか?自己署名証明書はどうですか? – yak

+0

@yak:独自のCAを構築する場合は、独自のルートCAを追加するだけです。自己署名すれば、CAである限り動作します(通常は必ずしもそうではありません)。そして* "これだけ信頼されているから" *:あなたが信頼できると宣言しない限り、何も信頼されません。 –

関連する問題