1

次の単純な python コードがあります。これは、ssl ハンドシェイクを実行し、クライアントとサーバーの間で証明書を検証することを目的としています。

ssl_test.py:

import ssl
import socket

s = socket.socket()
print "connecting..."
#logging.debug("Connecting")
# Connect with SSL mutual authentication
# We only trust our server's CA, and it only trusts user certificates signed by it
c = ssl.wrap_socket(s, cert_reqs=ssl.CERT_REQUIRED,
                    ssl_version=ssl.PROTOCOL_SSLv3, ca_certs='ca.crt',
                    certfile='user.crt', keyfile='user.key')
c.connect((constants.server_addr, constants.port))

これを実行すると、次のエラーが発生します。

>python ssl_test.py
Traceback (most recent call last):
  File "ssl_test.py", line 12, in <module>
    c.connect(('192.168.1.82', 7070))
  File "C:\Python27\lib\ssl.py", line 331, in connect
    self._real_connect(addr, False)
  File "C:\Python27\lib\ssl.py", line 314, in _real_connect
    self.ca_certs, self.ciphers)
ssl.SSLError: [Errno 0] _ssl.c:340: error:00000000:lib(0):func(0):reason(0)

このエラーの意味と解決方法を教えてください。

4

2 に答える 2

3

これはhttp://bugs.python.org/issue2687のように見え、次の回答が示されています。

いいえ、問題はクライアント側の「ca_certs」引数にあります。ディレクトリは使用できません。連結された多数の証明書を含むファイルを使用する必要があります。それを明確にするために、ドキュメントを強化します。

ca_certsあなたはディレクトリではなくファイルであることがわかりますが、おそらくこれはまだいくつかの光を当てています. ca.crt ファイルは有効にフォーマットされ、適切な場所にありますか?

于 2012-05-17T17:37:31.850 に答える
2

私はPythonを初めて使用し、元のssl.SSLErrorを検索した後、この道にたどり着きました。これが元の投稿者には役立たないことはわかっていますが、このエラーで他の人に役立つかもしれません。ほとんどの Python の例では、次を使用しています。

    ca_certs="/etc/ca_certs_file"

このファイルが存在しないため、このエラーが発生します。最新バージョンの Linux でシステム CA 証明書を使用するには、次を使用します。

    ca_certs="/etc/ssl/certs/ca-certificates.crt"
于 2012-06-29T00:39:54.157 に答える