セキュアソケットを使用してgmail SMTPサーバーに接続したいとします。私はmail.google.com.crt
の証明書ファイルをFirefox(私は単にgmail.com
ページを開いて、私のブラウザエクスポート証明書ボタンを使って証明書をエクスポートした)を使ってダウンロードしました。ssl.SSLError:[SSL:CERTIFICATE_VERIFY_FAILED]証明書の検証に失敗しました。Pythonソケット、ssl、gmail smtp connect
しかし、問題があるように見えますが、その理由はわかりません。私がmail.google.com.crt
をGeoTrustGlobalCA.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()
よろしくお願いいたします。だから、この証明書だけが信頼されているので、私は常に(最初から最後まで)証明書をエクスポートすべきですか? – yak
私自身のCAを構築したいと思うなら、これはうまくいかないでしょうか?自己署名証明書はどうですか? – yak
@yak:独自のCAを構築する場合は、独自のルートCAを追加するだけです。自己署名すれば、CAである限り動作します(通常は必ずしもそうではありません)。そして* "これだけ信頼されているから" *:あなたが信頼できると宣言しない限り、何も信頼されません。 –