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.
- https://www.verisign.com - dovrebbe funzionare, CA si sa
- https://www.us.army.mil - non dovrebbe funzionare, come CA non è noto
- 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?
quale versione di python stai testando? – strcat
Python 2.7.1 (r271: 86832, 16 giugno 2011, 16:59:05) – snies
ssl.OPENSSL_VERSION == 'OpenSSL 0.9.8r 8 Feb 2011' – snies