問題を(私は私を気に奇妙な例を、持っている):発行元CAはcacert.pemのファイル(テスト・ケース2に設けられていないが、pythonのsslモジュールは証明書を正しく検証していますか?
PythonのSSLモジュールは、証明書の文句を言っていません。以下)。 Mozillaから抽出したCAを使用します。 Firefoxは未知のCA(この場合は国防総省)について正しく苦情を言います。
証明書自体が検証されるだけで、CAは既知ではないようです。私はPython 2.7.1を実行しており、sslバージョンのOpenSSL 0.9.8rを使用しています。
テストケース:
はFirefoxで以下のサイトをチェックして、以下のPythonの例クライアントと。
- https://www.verisign.comは - CAが
- https://www.pcwebshop.co.ukを知られていないとして、動作してはならない - - CAが
- https://www.us.army.milを知られ、動作するはず働くべきではない、唯一のParallelsパネル証明書
ケース2。 Pythonクライアントによって検証されますが、そうではありません。予想通り
ケース3は、例外がスローされます。
routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
例のPythonクライアント:
CAファイル:http://curl.haxx.se/ca/cacert.pem(MozillaのデフォルトのCAカールメンテナによります)。私はこの動作を確認することができstrcatは他人の助けを借りて
さ:
http://docs.python.org/library/ssl.html#client-side-operationを少し変更したバージョン:
# test_ssl.py
import socket, ssl, pprint, sys
host = sys.argv[1]
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# require a certificate from the server
ssl_sock = ssl.wrap_socket(s,
# http://curl.haxx.se/ca/cacert.pem
ca_certs="cacert.pem",
cert_reqs=ssl.CERT_REQUIRED)
ssl_sock.connect((host, 443))
print repr(ssl_sock.getpeername())
print ssl_sock.cipher()
print pprint.pformat(ssl_sock.getpeercert())
# Set a simple HTTP request -- use httplib in actual code.
ssl_sock.write("""GET/HTTP/1.0\r
Host: """ + host + """\r\n\r\n""")
# Read a chunk of data. Will not necessarily
# read all the data returned by the server.
data = ssl_sock.read()
print data
# note that closing the SSLSocket will also close the underlying socket
ssl_sock.close()
使用法:
python test_ssl.py www.verisign.com
python test_ssl.py www.us.army.mil
python test_ssl.py www.pcwebshop.co.uk
UPDATEに特化:
- OSXライオン10.7.1
- のPython 2.7.1 &のPython 2.6.7
- 私は2つのMACおよび他のいくつかのボックスでテストのOpenSSL 0.9.8r 2011年2月8日
。私はMac上でのOpenSSLの疑惑を持っています。私が渡したファイルの横にある2番目のCA証明書のソースを使用しています。おそらくこれはwww.us.army.milを特別なテストケースにします。サファリはそれをボックスからも信じているようです。誰かが他の大きな自己署名サイトを知っていますか、あるいはMacでopensslが動作するのでしょうか?
どのバージョンのPythonでテストしていますか? – strcat
Python 2.7.1(r271:86832、2011年6月16日、16:59:05) – snies
ssl.OPENSSL_VERSION == 'OpenSSL 0.9.8r 2011年2月8日' – snies