Проверка однорангового узла в SSL с использованием Python - PullRequest
9 голосов
/ 05 октября 2009

Я пытался выяснить, как я могу проверить самозаверяющий сертификат на сервере в python. Я не мог найти много данных в Google. Я также хочу убедиться, что URL сервера

Заранее спасибо за любые идеи.

Ответы [ 3 ]

10 голосов
/ 06 октября 2009

Из комментариев к моему первому ответу я вижу, что существует общее недопонимание того, что означает «проверка сертификата». Я постараюсь написать краткое объяснение здесь, чтобы устранить некоторые из иллюзий.

Проверка сертификата заключается в проверке подписи на метаданных сертификата (т. Е. Субъекте, сроке действия, расширениях и т. Д.) В отношении некоторой криптографической подписи.

Если для проверки у вас есть только самозаверяющий сертификат, вы не сможете отличить его от другого самозаверяющего сертификата с точно такими же метаданными, но с другим ключом, если вы заранее не знаете ключ сертификата ключа. И не забывайте, что вы устанавливаете всю эту процедуру проверки, чтобы убрать требование иметь эти предварительные знания. При регулярной проверке сертификатов вы не можете полностью отменить требование наличия некоторого предварительного общего знания, которое представляет собой набор сторонних сертификатов, также известных как «сертификаты ЦС». Поскольку эти знания предварительно распространяются, эти сертификаты могут быть самозаверяющими, но помните, что вы получили информацию о действительности этих сертификатов не из процесса проверки, а из некоторого внешнего знания.

Когда у вас есть набор доверенных «сертификатов ЦС», распределенных между одноранговыми узлами, вы можете использовать их для подписи других сертификатов и проверки подписей на основе этих предварительных знаний доверенных ЦС.

Но если у вас нет дополнительных знаний о самозаверяющем сертификате, кроме самого сертификата, вы не можете делать предположения о доверии этому конкретному сертификату, поскольку он может быть выдан неким злым хакером, а также вашим заслуживающим доверия сервером.

Пожалуйста, приобретите некоторые знания о Человек в середине атаки , Инфраструктура открытого ключа и Криптография с открытым ключом в целом, прежде чем внедрять какие-либо процессы проверки сертификатов .

Пожалуйста, поймите, что слепая проверка самозаверяющего сертификата не защитит вас даже от умного хакера в вашей собственной сети, даже не принимая во внимание интернет-безопасность в целом.

Редактировать : автор вопроса уточнил, что он на самом деле искал, как проверить подпись verisign (или другого CA) на сертификате, используя привязки M2Crypto. Вот два примера:

from M2Crypto import X509, SSL

# manual validation of a signature on a certificate using a given CA cert:
ca = X509.load_cert('/path/to/ca_cert.pem')
cert = X509.load_cert('certificate_to_validate.pem')
print "Verification results:", cert.verify(ca.get_pubkey())

# adding a given CA cert to the SSL Context for verification
ctx = SSL.Context()
# load a certificate from file
ctx.load_verify_locations(cafile='/path/to/ca_cert.pem') 
# or use all certificate in a CA directory
ctx.load_verify_locations(capath='/path/to/ca/dir') 
# or you can specify both options at the same time.

Если вы собираетесь использовать каталог со многими сертификатами CA (что часто более удобно), вы должны переименовать каждый сертификат в <hash>.0, где <hash> - хэш субъекта сертификата (полученный с помощью openssl x509 -noout -hash -in cert.pem).

2 голосов
/ 05 октября 2009

Я предполагаю, что вы используете некоторую привязку OpenSSL. Я вижу 2 способа решить вашу проблему.

  1. Вы можете добавить свой сертификат в каталог openssl (запустите openssl version -d, чтобы увидеть его для вашей системы). Это повлияет на все программы, использующие openssl на вашем компьютере.
  2. Загрузите сертификат и добавьте его во время выполнения (приведенный ниже эскиз кода предназначен для PyOpenSSL, но он должен быть аналогичным для других привязок):

.

x509 = OpenSSL.crypto.load_certificate(...)
ctx = OpenSSL.SSL.Context(...)
store = ctx.get_cert_store()
store.add_cert(x509)
ctx.set_verify(VERIFY_PEER | VERIFY_FAIL_IF_NO_PEER_CERT, ...)
0 голосов
/ 05 октября 2009

Невозможно проверить самозаверяющий сертификат по самой его природе: он самоподписан.

Вы должны подписать сертификат сертификатом другой доверенной третьей стороны, чтобы иметь возможность что-либо проверять, и после этого вы можете добавить сертификат этой третьей стороны в список доверенных ЦС, а затем вы сможете проверить подписанные сертификаты этим сертификатом / CA.

Если вы хотите получить рекомендации о том, как это сделать в Python, вам следует указать имя используемой вами библиотеки SSL, поскольку для Python есть выбор библиотек SSL.

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