Проблема:
Модуль Python ssl не жалуется на сертификат, хотя выдающий CA не указан в файле cacert.pem (контрольный пример 2. ниже). Я использую CA, извлеченные из Mozilla. Firefox правильно жалуется на неизвестный CA (в данном случае Министерство обороны).
Кажется, что только сам сертификат проверен, но CA не известен. Я использую Python 2.7.1 и использую ssl версию OpenSSL 0.9.8r.
Тестовые случаи:
Проверьте следующие сайты в Firefox и с примером клиента Python ниже.
- https://www.verisign.com - должно работать, CA известен
- https://www.us.army.mil - не должен работать, так как CA не известен
- https://www.pcwebshop.co.uk - не должен работать, только сертификат Parallels Panel
Случай 2. проверяется клиентом python, хотя не должен.
Случай 3. создает ожидаемое исключение:
routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Пример Python-клиента:
Файл CA: http://curl.haxx.se/ca/cacert.pem (CA по умолчанию для Mozilla, выполняемые сопровождающими curl).
Слегка измененная версия 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:
С помощью strcat и других я могу подтвердить, что это поведение относится к:
- OSX Lion 10.7.1
- Python 2.7.1 и Python 2.6.7
- OpenSSL 0.9.8r 8 февраля 2011
Я тестировал на двух маках и нескольких других коробках. У меня есть подозрение, что OpenSSL на Mac использует второй источник сертификатов CA рядом с файлом, который я передаю ему. Может быть, это делает www.us.army.mil особым тестовым сценарием, так как сафари, похоже, тоже доверяет ему из коробки. Кто-нибудь знает другие крупные самозаверяющие сайты или как работает openssl на mac?