2012-03-07 16 views
5

問題を(私は私を気に奇妙な例を、持っている):発行元CAはcacert.pemのファイル(テスト・ケース2に設けられていないが、pythonのsslモジュールは証明書を正しく検証していますか?

PythonのSSLモジュールは、証明書の文句を言っていません。以下)。 Mozillaから抽出したCAを使用します。 Firefoxは未知のCA(この場合は国防総省)について正しく苦情を言います。

証明書自体が検証されるだけで、CAは既知ではないようです。私はPython 2.7.1を実行しており、sslバージョンのOpenSSL 0.9.8rを使用しています。

テストケース:

はFirefoxで以下のサイトをチェックして、以下のPythonの例クライアントと。

  1. https://www.verisign.comは - CAが
  2. https://www.pcwebshop.co.ukを知られていないとして、動作してはならない - - CAが
  3. 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が動作するのでしょうか?

+0

どのバージョンのPythonでテストしていますか? – strcat

+0

Python 2.7.1(r271:86832、2011年6月16日、16:59:05) – snies

+0

ssl.OPENSSL_VERSION == 'OpenSSL 0.9.8r 2011年2月8日' – snies

答えて

0

策がある:私は確認できたテストを通じて

、それはOSXのopensslの上、上記のpythonの例に見られるように指定されていない場合でも、システムのCA証明書ストアを使用しません。

自己署名サイトであることが判明しているので、私はwww.us.army.milをテストケースとして使用しました(http://royal.pingdom.com/2008/08/19/new-ssl-policy-in -firefox-hurting-数十万点のサイト)。 OSX上のシステムCA証明書には2つのDoD証明書が含まれているので、Safariは私のpythonテストクライアントにも苦情を申し立てません。私はKeychan Accessでそれらの証明書をUNTRUST場合

は - >システムのルーツ - >証明書のpythonクライアントが指定されているか否かのpython SSLが/ OpenSSLがOSX 10.7.1でのシステムのルート証明書を使用していることを確認して期待される動作を示し、 。私はこれが期待された行動かどうかはわかりませんが、確かに私を驚かせました。

1

アップルはOpenSSLのブランチにこのセキュリティ上の脆弱性や機能を導入したパッチを導入しました。このパッチを参照してください:http://www.opensource.apple.com/source/OpenSSL098/OpenSSL098-32/src/crypto/x509/x509_vfy_apple.c

これを回避する1つの方法は、あなたがTEAとの統合を持つべきではないopenssl.orgのソースからビルドしたopensslバージョンでpythonアプリケーションをバンドルすることです。

関連する問題