0

Python ソケットを使用して、ssl 経由の要求のみを受け入れるドメイン レジストラーに Extensible Provisioning Protocol (EPP) 要求を作成しようとしています。

証明書ファイル: www.myDomain.se.crt キー ファイル: mydomain.pem

openssl s_client -connect epptestv3.iis.se:700 -cert www.myDomain.se.crt -key mydomain.pem

openssl クライアントを使用してリクエストを作成しようとすると、レジストラから挨拶応答を正常に取得できますが、Python で次のコードを使用すると、ssl 証明書エラーが発生します。

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(15)
sock.connect(('epptestv3.iis.se', 700))
sock.settimeout(60)  # regular timeout


ssl_keyfile='myDomain.pem'
ssl_certfile='www.myDomain.se.crt'
ssl_ciphers='AES256-GCM-SHA384'
ssl_version=ssl.PROTOCOL_TLSv1_2

sock = ssl.wrap_socket(sock,
                        ssl_keyfile,
                        ssl_certfile,
                        ssl_version=ssl_version,
                        ciphers=ssl_ciphers,
                        server_side=False,
                        cert_reqs=ssl.CERT_REQUIRED,
                        ca_certs=None
                        )

スクリプトを実行すると、次のエラーが表示されます。

Traceback (most recent call last):
  File "server_connect.py", line 54, in <module>
    ca_certs=ssl_keyfile
  File "/usr/lib/python2.7/ssl.py", line 933, in wrap_socket
    ciphers=ciphers)
  File "/usr/lib/python2.7/ssl.py", line 601, in __init__
    self.do_handshake()
  File "/usr/lib/python2.7/ssl.py", line 830, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)

ここで何が問題なのですか?

4

1 に答える 1

3

あなたのコードから:

                    cert_reqs=ssl.CERT_REQUIRED,
                    ca_certs=None

wrap_socketのドキュメントから:

このパラメーターの値が CERT_NONE でない場合、ca_certs パラメーターは CA 証明書のファイルを指している必要があります

基本的に、サーバーからの証明書を検証するようにコードで要求します ( CERT_REQUIRED) が、同時に信頼されたルートがないことを指定します ( ca_certs=None)。しかし、信頼されたルート証明書がなければ、検証を行うことはできません。

代わりに使用するようにコードを変更するCERT_NONEことは悪い考えであることに注意してください。証明書の検証が行われないため、おそらく機能しますが、中間者攻撃に対しては無防備です。

于 2016-10-16T14:10:23.103 に答える