Вопрос по ssl, openssl – OpenSSL разумное значение по умолчанию для доверенных сертификатов CA?

10

Есть ли способ настроить контекст OpenSSL (SSL_CTX) с разумным набором доверенных сертификатов CAwithout распространять их сам? Я не хочу отвечать за их актуальность. IMO, любая современная операционная система должна предоставлять «Получите мне доверенные сертификаты CA». как услуга, но я не знаю, так ли это на самом деле.

Я не против написать этот код три раза (один раз для Windows, один раз для Mac OS X и один раз для Linux), но я бы предпочел ограничить это. В частности, я не буду пытаться писать код, который слоняется вокруг, ища, какие браузеры установлены, и пытаясь извлечь их доверенные сертификаты. (По-видимому, этолегко понять это очень неправильно.)

Ответ для последних версий Linux, кажется, заключается вSSL_CTX_load_verify_locations с/etc/ssl/certs/ca-certificates.crt (если этот файл существует).

Есть ли простые ответы для Windows и Mac OS X?

Ваш Ответ

3   ответа
5

curl's script который преобразует список из Mozilla (изОтвет сопровождающего Curl). В соответствии сего кодкажется, чтобы проверить, является ли сертификат доверенным или нет, прежде чем включать его.

5

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

Получить сертификаты в брелок

Если Какао не подходит для ваших нужд, и вы хотите делать все прямо из командной строки, вы можете использоватьcerttool полезность - см.man certtool и другая онлайн-документация, чтобы узнать об этом. Чтобы перечислить все сертификаты в цепочке для ключей входа пользователя, вы можете сделать следующее:

certtool y k=login.keychain

Или получить список встроенных доверенных системных корней:

certtool y k=/System/Library/Keychains/SystemRootCertificates.keychain

и возможно

certtool y k=/System/Library/Keychains/SystemCACertificates.keychain

Я уверен, что есть и другие способы получить эту информацию, используя системные интерфейсы.

На стороне Linux, да,/etc/ssl/certs/ca-certificates.crt это правильный путь. Этот файл будет существовать в производных Debian (включая варианты Ubuntu), когдаca-certificates пакет установлен, и я не уверен, как его правильно установить в системах на основе Redhat.

Смотрите также MacPorts & apos; утилита certsync (trac.macports.org/browser/trunk/dports/security/certsync/#filesфактический код находится вfiles/certsync.m), который также экспортирует доверенные корни в файл и обращает внимание на флаги доверия (не экспортируя их).
Я не думаю, что certtool покажет что-либо относительно уровней доверия; Вы хотите запросить достоверность с использованием другого механизма. Пытатьсяman security с одной стороны, если вы действительно используете для этого инструменты командной строки.
Ты знаешь какcerttool ведет себя для сертификатов, которые явно помечены как "никогда не доверять", хотя?
9

На Windows: получить сертификаты от Windows"ROOT" хранилище сертификатов с использованиемCertOpenSystemStoreзациклить их, используяCertEnumCertificatesInStoreВозьмите сырой сертификат в кодировке X509 сpbCertEncoded полеCERT_CONTEXTсоздать OpenSSLX509 структура с использованиемd2i_X509и добавьте его в хранилище сертификатов OpenSSL, используяX509_STORE_add_cert, Все функции Windows доступны сcrypt32.dll.

В Mac OS X: получите сертификаты от"/System/Library/Keychains/SystemRootCertificates.keychain" брелок с помощьюSecKeychainOpenсоздайте итератор для сертификатов в цепочке для ключей, используяSecKeychainSearchCreateFromAttributesитерируйте, используяSecKeychainSearchCopyNext, получите сырой сертификат X509 используяSecItemExportсоздать сертификат OpenSSL с помощьюd2i_X509и добавьте его в хранилище OpenSSL, используяX509_STORE_add_cert, Функции Mac доступны с/Systems/Library/Frameworks/Security.framework/Security.

Лучшим подходом может быть создание OpenSSLX509_STORE с обратным вызовом, который использует функции ОС для проверки отдельного корневого сертификата, вместо того, чтобы копировать их все, но я не пробовал этого.

@proteneer, код теперь является частью библиотеки Racket openssl здесь:github.com/plt/racket/tree/master/racket/collects/openssl/… Ryan Culpepper
Можете поделиться кодом?

Похожие вопросы