私は学習目的で小さな安全な 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 の組み込みライブラリのみを使用できるシャープな運用環境に導入する予定です。
どんな助けでも素晴らしいでしょう!