12

私は学習目的で小さな安全な HTTPS クライアントを実行しようとしており、SSL のすべてのメカニズムが今のところより高いレベルでどのように機能するかを確認しているので、ssl.wrap_socket を介して単純なソケットを ssl に変換しようとしています。

私はおそらく全体のコンセプトを逆手に取りましたが、ここで私がやっていることは次のとおりです。

s.connect((host, port))
if port == 443:
    f = open('cacerts.txt', 'r')
    calist = f.read()
    f.close()
    ca = ssl.get_server_certificate((host, port), ssl_version=ssl.PROTOCOL_SSLv3|ssl.PROTOCOL_TLSv1)
    if not ca in calist:
        f = open('cacerts.txt', 'a')
        f.write(ca)
        f.close()
    s = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_SSLv3|ssl.PROTOCOL_TLSv1, cert_reqs=ssl.CERT_REQUIRED, ca_certs="cacerts.txt")
    s.do_handshake()

do_handshake() を呼び出すと、次のようになります。

Traceback (most recent call last):
  File "SSL_test.py", line 84, in Requester
    s = ssl.wrap_socket(s, ssl_version=ssl.PROTOCOL_SSLv3|ssl.PROTOCOL_TLSv1, cert_reqs=ssl.CERT_REQUIRED, ca_certs="cacerts.txt")
  File "C:\Python26\lib\ssl.py", line 338, in wrap_socket
    suppress_ragged_eofs=suppress_ragged_eofs)
  File "C:\Python26\lib\ssl.py", line 120, in __init__
    self.do_handshake()
  File "C:\Python26\lib\ssl.py", line 279, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [Errno 1] _ssl.c:490: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

私はしばらくの間検索して、私がしていることに近いものを見つけようとしましたが、誰もが PyOpenSSL または Twisted のいずれかを指しています。これを、Python2.6 の組み込みライブラリのみを使用できるシャープな運用環境に導入する予定です。

どんな助けでも素晴らしいでしょう!

4

2 に答える 2

10

ここでの問題は、証明書が自己署名されていて、CA ビットが設定されていない限り、証明書をそれ自体で検証できないことです (これがあなたがやろうとしていることです)。Web サイトの実際の CA 証明書をcacerts.txtファイルに追加する必要があります。もう 1 つの代替手段 (Web ブラウザーで「とにかく接続する」など) は、そのような例外が発生した後に to をドロップcert_reqsssl.CERT_NONE、中間に男性がいる可能性があることを理解することです。これはsslモジュールの問題ではなく、SSL/X.509 の仕組みです。

于 2011-09-21T15:53:04.857 に答える
1

学習中の場合は、Anonymous Diffie-Hellmanを使用することもできます。つまり、サーバーには証明書がまったくなく、クライアントはそれを検証する必要がありません。

以下は単純な (そして安全でない) テストです。

テストサーバー、opensslパッケージ提供:

openssl s_server  -nocert -cipher "ALL:aNULL:eNULL"

でクライアントをテストPython:

...
ssl.wrap_socket(..., ciphers="ALL:aNULL:eNULL")
...

--

証明書をいじりたい場合、opensslパッケージは必要なものを生成できますが、それを正しく行うのは少し難しいです。優れた GUI ツールは ですTinyCA。これは perl で記述され、openssl コマンドを使用しますが、独自の CA を作成したり、独自の証明書に署名したりするための適切なフレームワークを提供します。

お急ぎの場合は、Apache をインストールして起動するだけで、ディストリビューション (Linux または WAMP) が自己署名証明書を作成して開始できる可能性が高くなります。ブラウザで接続できるように apache を設定しますhttps://localhost。次に、そのサーバーを使用して接続します。サーバーの自己署名 CA をクライアント CA リスト/ファイルに追加すればうまくいくと思います。

于 2013-12-03T10:02:53.143 に答える