2

SSL で保護された Web ページから情報を取得するソフトウェアを作成しています。以下は、サーバーに接続するために使用するコードです。

s = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = ssl.wrap_socket (
    s,
    ca_certs = '/home/stilz/Desktop/Certyfikaty/GLOWNE_CA.cer',
    cert_reqs = ssl.CERT_REQUIRED,
    ssl_version = ssl.PROTOCOL_SSLv3,
)
ssl_sock.connect ((HOST, PORT))

ただし、これは機能しません。「ハンドシェイクアラートが失敗しました」というメッセージで例外をスローします。スクリプトから出てくるいくつかの TCP パケットと Internet Explorer からの対応するパケットをキャプチャしたところ、IE が正常に送信している間、スクリプトが証明書をまったく送信しないことがわかりました (サーバーは「致命的: 証明書が提供されていません」のようなものを返します)。私が知る限り、ファイル ca.cer は x509 証明書です (「-----BEGIN CERTIFICATE-----」で始まります)。

私を助けて、私が間違っていることを教えてください。私が提供した情報が少ない場合は、お知らせください。

よろしく

4

2 に答える 2

1

最初に、サーバー上で自分自身を認証する必要があるか (この場合のみ証明書がサーバーに送信される)、またはサーバーの信頼性を検証する必要があるか (この場合、証明書はサーバーに送信されない) を判断する必要があります。

コードの問題について:

ケース 1: サーバーで認証する必要はありません。この場合、証明書を指定する必要はなく、サーバーには何も送信されません。

ケース 2: サーバーで自分自身を認証する必要があります。その場合、証明書と秘密鍵ファイルを keyfile および certfile パラメーターで指定する必要があります。その後、証明書がサーバーに送信されます (秘密鍵はハンドシェイクで使用されます)。

実際にはケース1があると思います。そのため、まず、Web ブラウザーを使用してサーバーに接続し、サイトの証明書チェーンを調べて、サーバーが有効な証明書を提供しているかどうかを確認する必要があります。サイトが証明書を送信しても、中間 CA 証明書が省略されている場合があります。

いずれにせよ、再読することをお勧めするPython ドキュメントの証明書に関する議論を思い出していただきたいと思います。

于 2011-06-25T12:22:04.967 に答える
0

サーバーがクライアントからの証明書の送信を要求 (および要求) する場合は、証明書へssl.wrap_socketパス( ) とそれに対応する秘密鍵 ( ) を指定する必要があります。このパラメーターは、クライアントが既知の CA 証明書に対してサーバーの証明書を検証するためにのみ使用され、クライアント証明書の送信とは関係ありません。certfilekeyfileca_certs

クライアント証明書と秘密鍵を IE からエクスポートする必要がある場合があります (その後、それらを PEM 形式に変換します)。

于 2011-06-25T12:17:16.233 に答える