2013-09-09 3 views
2

Вопроспроверить сертификат SSL/X.509 подписан другим сертификатом

Как я могу проверить, что сертификат X.509 подписан другим сертификатом с помощью PyOpenSSL или Twisted? Я хочу, чтобы клиент подтвердил, что полученный сертификат сервера является тем, который подписал его клиентский сертификат.

Я просмотрел документацию PyOpenSSL и не могу найти ничего о том, как проверить сертификат отдельно от установления SSL-соединения.

Я нашел ссылку на OpenSSL.crypto:X509.verify() в twisted.internet._sslverify:PublicKey.verifyCertificate(), но скрученный метод закомментирован (в Twisted 13.0), а метод X509 не существует (в PyOpenSSL 0.13).

pyOpenSSL has no support for verifying a certificate описывает ошибку в том, что вы не можете вручную проверить цепочку сертификатов, но я не совсем уверен, что это то, что я пытаюсь сделать.

Использования

Сертификаты:

  • Сформирован самозаверяющими CA сертификат с OpenSSL.

  • Сгенерированный сертификат сервера, подписанный сертификатом CA.

  • Сгенерированный сертификат клиента, подписанный сертификатом сервера.

Установка:

  • Сервер использует Twisted-х CertificateOptions с сервером серт. Сертификатами CA являются сертификаты CA и сервера для настройки цепочки, где серверный сертификат проверяет полученный сертификат клиента, а сертификат CA проверяет сертификат сервера (все встроенные функции).

  • Клиент также использует CertificateOptions для сертификата клиента. Сертификаты CA содержат только сертификат CA.

Это все работает отлично (с обеих сторон проверить друг друга), но я хочу, чтобы выполнить дополнительный шаг:

  • В клиент set_verify() обратного вызова, убедитесь, что клиент сертификат подписывается серт сервера ,
+0

Вы уверены, что не хотите, чтобы вы правильно настроили ваши доверенные корни CA? –

+0

Мое намерение заключалось в том, чтобы определенные пользователи (с сертификатами клиентов) подключались к серверу (имеет сертификат сервера). Но клиенты будут проверять, что они подключены к реальному серверу (клиент проверяет, что собственный сертификат подписан сертификатом сервера), а не только доверяет серверу, подписанному корневым центром сертификации. Это избыточно, чтобы клиенты проверяли личность сервера таким образом? Или это действительно невозможно? Или есть более простой способ? – cpburnz

+0

Это не избыточно, но оно отступает от обычного подхода. В pyOpenSSL есть API-интерфейсы, которые позволят вам настроить ваш клиент так, чтобы он позволял подключаться только к серверу, используя сертификат, подписанный (или одним из нескольких) определенным сертификатом. В pyOpenSSL нет API-интерфейсов для ограничения успешных соединений с теми, где сертификат сервера - это тот, который подписывает сертификат клиента. Было бы невозможно организовать это, но это будет связано с первым расширением pyOpenSSL (или появлением некоторого творческого альтернативного способа проверки подписей на сертификат). –

ответ

0

Вы должны быть в состоянии сделать это с чем-то вроде написано здесь: http://www.yothenberg.com/validate-x509-certificate-in-python/ который в основном:

  1. загрузить свои сертификаты в PyOpenSSL с load_certificate()
  2. создайте X509Store() объект
  3. использования add_cert(), чтобы добавить свой промежуточный сертификат в магазин
  4. создать X509StoreContext() объект, инициализирует его и с вашего магазина объекта и вашего конечного сертификата
  5. вызова verify_certificate() на вашем магазине объект контекста

На практике, я не смог сделать эту часть, и я думаю, что это объясненных причины здесь: https://mail.python.org/pipermail/cryptography-dev/2016-August/000676.html

Короче говоря, даже в 2016 году все еще не кажется правильным ждать проверки сертификатов в PyOpenSSL, что очень печально. Обратите внимание, что консенсус, по-видимому, заключается в том, что если вы работаете в TLS-соединении, то лучше проверять процедуру подключения вместо автономной через check_certificate().