Модуль Python ssl правильно проверяет сертификаты?(У меня есть странный пример, который меня беспокоит) - PullRequest
5 голосов
/ 07 марта 2012

Проблема:

Модуль Python ssl не жалуется на сертификат, хотя выдающий CA не указан в файле cacert.pem (контрольный пример 2. ниже). Я использую CA, извлеченные из Mozilla. Firefox правильно жалуется на неизвестный CA (в данном случае Министерство обороны).

Кажется, что только сам сертификат проверен, но CA не известен. Я использую Python 2.7.1 и использую ssl версию OpenSSL 0.9.8r.

Тестовые случаи:

Проверьте следующие сайты в Firefox и с примером клиента Python ниже.

  1. https://www.verisign.com - должно работать, CA известен
  2. https://www.us.army.mil - не должен работать, так как CA не известен
  3. 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?

Ответы [ 2 ]

1 голос
/ 23 марта 2012

Apple представила патч для своей ветки OpenSSL, который представил этот возможный недостаток безопасности или функцию, независимо от того, как вы на это смотрите. Смотрите этот патч: http://www.opensource.apple.com/source/OpenSSL098/OpenSSL098-32/src/crypto/x509/x509_vfy_apple.c

Один из способов обойти это состоит в том, чтобы связать ваше приложение на python с версией openssl, которую вы создали из исходников openssl.org, которая не должна иметь интеграции TEA.

1 голос
/ 07 марта 2012

Решение:

Посредством тестирования я мог подтвердить, что в OSX openssl использует хранилище сертификатов системного CA, даже если не указано, как видно из приведенного выше примера с python.

Я использовал www.us.army.mil в качестве тестового примера, поскольку он известен как самозаверяющий сайт (http://royal.pingdom.com/2008/08/19/new-ssl-policy-in-firefox-hurting-tens-of-thousands-of-sites/). Как выяснилось, системные сертификаты CA в OSX содержат два сертификата DoD, поэтому Safari не жалуется , а также мой клиент тестирования Python.

Если я не доверяю этим сертификатам в Keychan Access -> Системные корни -> Сертификаты , клиент Python показывает ожидаемое поведение, что подтверждает, что Python ssl / OpenSSL использует корневые сертификаты системы в OSX 10.7.1. указано или нет. Я не знаю, является ли это ожидаемым поведением, но это, конечно, удивило меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...