Вопроспроверить сертификат 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() обратного вызова, убедитесь, что клиент сертификат подписывается серт сервера ,
Вы уверены, что не хотите, чтобы вы правильно настроили ваши доверенные корни CA? –
Мое намерение заключалось в том, чтобы определенные пользователи (с сертификатами клиентов) подключались к серверу (имеет сертификат сервера). Но клиенты будут проверять, что они подключены к реальному серверу (клиент проверяет, что собственный сертификат подписан сертификатом сервера), а не только доверяет серверу, подписанному корневым центром сертификации. Это избыточно, чтобы клиенты проверяли личность сервера таким образом? Или это действительно невозможно? Или есть более простой способ? – cpburnz
Это не избыточно, но оно отступает от обычного подхода. В pyOpenSSL есть API-интерфейсы, которые позволят вам настроить ваш клиент так, чтобы он позволял подключаться только к серверу, используя сертификат, подписанный (или одним из нескольких) определенным сертификатом. В pyOpenSSL нет API-интерфейсов для ограничения успешных соединений с теми, где сертификат сервера - это тот, который подписывает сертификат клиента. Было бы невозможно организовать это, но это будет связано с первым расширением pyOpenSSL (или появлением некоторого творческого альтернативного способа проверки подписей на сертификат). –