Ответ 1
Вы можете использовать curl
script, который преобразует список из Mozilla (из Ответчик скручивания). Согласно его код, похоже, проверяет, доверен ли сертификат или нет, прежде чем включать его.
Есть ли способ настроить контекст 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?
Вы можете использовать curl
script, который преобразует список из Mozilla (из Ответчик скручивания). Согласно его код, похоже, проверяет, доверен ли сертификат или нет, прежде чем включать его.
Вот что я в итоге сделал:
В 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
с обратным вызовом, который использует функции ОС для проверки отдельного корневого сертификата, а не для копирования всех из них, но я этого не пробовал.
В 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.