2012-03-07 10 views
5

Il problema:Il modulo ssl di python convalida correttamente i certificati? (Ho un esempio strano, che mi preoccupa)

modulo SSL di Python non si lamenta di un certificato, anche se la CA di emissione non è previsto nel file cacert.pem (Test Case 2. sotto). Io uso le CA estratte da Mozilla. Firefox si sta lamentando correttamente della CA sconosciuta (in questo caso il Dipartimento della Difesa).

Sembra che solo il certificato stesso venga convalidato, non che la CA sia nota. Sto eseguendo Python 2.7.1 e usando la versione ssl OpenSSL 0.9.8r.

casi di test:

Controllare i seguenti siti in Firefox e con l'esempio di client python di seguito.

  1. https://www.verisign.com - dovrebbe funzionare, CA si sa
  2. https://www.us.army.mil - non dovrebbe funzionare, come CA non è noto
  3. https://www.pcwebshop.co.uk - non dovrebbe funzionare, solo certificato di Parallels Panel Caso 2

. viene convalidato dal client python anche se non dovrebbe.

Caso 3. genera un'eccezione come previsto:

routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed 

Il Cliente Esempio Python:

file di CA: http://curl.haxx.se/ca/cacert.pem (default di Mozilla CA dal ricciolo manutentori).

versione leggermente modificata del 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() 

Usage:

python test_ssl.py www.verisign.com 
python test_ssl.py www.us.army.mil 
python test_ssl.py www.pcwebshop.co.uk 

UPDATE:

Con l'aiuto di strcat e altri ho potuto verificare questo comportamento è specifico per:

  • OSX Lion 10.7.1
  • Python 2.7.1 Python 2.6.7 &
  • OpenSSL 0.9.8r 8 Feb 2011

ho testato su due Mac e diverse altre scatole. Ho il sospetto che OpenSSL su mac usi una seconda fonte di certificati CA accanto al file che gli passo. Forse questo rende www.us.army.mil un banco di prova speciale, visto che anche il safari sembra fidarsi di esso. Qualcuno conosce altri grandi siti autofirmati o come funziona openssl su mac?

+0

quale versione di python stai testando? – strcat

+0

Python 2.7.1 (r271: 86832, 16 giugno 2011, 16:59:05) – snies

+0

ssl.OPENSSL_VERSION == 'OpenSSL 0.9.8r 8 Feb 2011' – snies

risposta

0

La soluzione è:

Attraverso test ho potuto confermare che su OSX OpenSSL fa uso dei certificati sistema di CA, anche se non specificato come visto nell'esempio sopra pitone.

Ho utilizzato www.us.army.mil come banco di prova come è noto per essere un sito autofirmato (http://royal.pingdom.com/2008/08/19/new-ssl-policy-in -firefox-ferire-decine di migliaia-di-siti /). Come risulta che i certificati CA di sistema su OSX contengono due certificati DoD e quindi Safari non si lamenta, e anche il mio client di prova python.

Se i untrust tali certificati in keychan di accesso -> Radici di sistema -> Certificati il cliente pitone mostra il comportamento previsto, il che conferma che python SSL/OpenSSL utilizza i certificati radice sistema su OSX 10.7.1 sia specificato o meno . Non so se questo è il comportamento previsto, ma sicuramente mi ha sorpreso.

1

Apple ha introdotto una patch nella propria filiale di OpenSSL che ha introdotto questo possibile difetto di sicurezza o funzionalità, a prescindere da come la si guardi. Vedi questa patch: http://www.opensource.apple.com/source/OpenSSL098/OpenSSL098-32/src/crypto/x509/x509_vfy_apple.c

Un modo per aggirare questo problema è quello di raggruppare la tua app Python con una versione di openssl che hai creato da fonti di openssl.org, che non dovrebbe avere l'integrazione TEA.

Problemi correlati