ssl moduł Pythona nie narzeka certyfikatu, chociaż wydawania CA nie jest dostarczana w pliku cacert.pem (Test Case 2. poniżej). Używam CA wyodrębnionych z Mozilli. Firefox prawidłowo narzeka na nieznany CA (w tym przypadku Departament Obrony).
Wygląda na to, że tylko sam certyfikat jest sprawdzany, a nie, że CA jest znany. Używam Pythona 2.7.1 i korzystam z wersji ssl OpenSSL 0.9.8r.
przypadków testowych:
Sprawdź następujące strony w Firefoksie i na przykładzie Pythona klienta poniżej.
- https://www.verisign.com - powinny działać, CA jest znane
- https://www.us.army.mil - nie powinny działać, jak CA nie jest znana
- https://www.pcwebshop.co.uk - nie powinny działać, tylko certyfikatowi Parallels panelu
przypadek 2. zostanie sprawdzony przez klienta Pythona, chociaż nie powinien.
Przypadek 3. zgłasza wyjątek zgodnie z oczekiwaniami:
routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Przykład ten Python Klient:
plik CA: http://curl.haxx.se/ca/cacert.pem (domyślnie Mozilli urzędy przez opiekunów curl).
Nieco zmodyfikowana wersja 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()
Zastosowanie:
python test_ssl.py www.verisign.com
python test_ssl.py www.us.army.mil
python test_ssl.py www.pcwebshop.co.uk
UPDATE:
Z pomocą strcat i innych mogę potwierdzić to zachowanie jest specyficzne dla:
- OSX Lion 10.7.1
- Python 2.7.1 Python 2.6.7 &
- OpenSSL 0.9.8r 8 Lut 2011
Testowałem na dwóch komputerach Mac i kilku innych polach. Podejrzewam, że OpenSSL na Macu używa drugiego źródła certyfikatów CA poza plikiem, który mu przekazuję. Może to sprawia, że www.us.army.mil jest specjalną próbą, ponieważ Safari wydaje się ufać temu po wyjęciu z pudełka. Czy ktoś zna inne duże strony z autografami lub jak działa openssl na Mac?
której wersji Pythona testujesz? – strcat
Python 2.7.1 (r271: 86832, 16 czerwca 2011, 16:59:05) – snies
ssl.OPENSSL_VERSION == 'OpenSSL 0.9.8r 8 lutego 2011' – snies