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

Есть ли способ настроить контекст OpenSSL (SSL_CTX) с помощью разумного набора доверенных сертификатов ЦС, не распространяя их самостоятельно? Я не хочу, чтобы они постоянно обновляли их. IMO любая современная операционная система должна предоставлять "получить мне доверенные сертификаты CA" в качестве службы, но я не знаю, действительно ли это произошло.

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

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

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

Ответ 1

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

Ответ 2

Вот что я в итоге сделал:

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

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

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

Ответ 3

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

Получить сертификаты в цепочке ключей

Если Cocoa не подходит для ваших нужд, и вы хотите сделать все прямо из командной строки, вы можете использовать утилиту 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.