Проблема с проверкой цепи сертификатов SSL
Мое приложение использует SSL для безопасного взаимодействия с сервером, и у него возникают проблемы с проверкой цепи сертификатов. Цепочка выглядит так:
Сертифицированный сервер сертификации Entrust.net → DigiCert Global CA → *.ourdomain.com
Мы используем хранилище сертификатов, извлеченное из Mozilla. Он содержит сертификат Entrust.net, но не DigiCert Global CA.
Мое понимание заключается в том, что промежуточному органу не нужно доверять, пока существует root, но проверка не выполняется:
% openssl verify -CAfile mozilla-root-certs.crt ourdomain.com.crt
error 20 at 0 depth lookup:unable to get local issuer certificate
Так что мне нужно явно доверять DigiCert Global CA для проверки? Это кажется неправильным. Но ты говоришь мне!
EDIT: теперь я понимаю, что файл сертификата должен быть доступен для OpenSSL спереди. Что-то вроде этого работает:
% openssl verify -CAfile mozilla-root-certs.crt -untrusted digicert.crt ourdomain.com.crt
ourdomain.com.crt: OK
Это позволяет мне предоставить копию DigiCert CA без явного указания "Я доверяю ей", целая цепочка еще нуждается в проверке.
Но, безусловно, браузеры, подобные Firefox, не всегда будут поставлять с копией каждого отдельного сертификата, который ему когда-либо понадобится. Всегда будут новые центры сертификации, и необходимо использовать защиту корневого сертификата, чтобы убедиться, что все промежуточные ЦС действительны. Правильно? Так, как это работает? Неужели это так глупо, как кажется?
Ответы
Ответ 1
Промежуточные сертификаты должны быть установлены на ваших веб-серверах, а также сертификаты для вашего собственного домена. У меня была такая же проблема на прошлой неделе... Firefox кажется более придирчивым, чем остальные браузеры об этом.
Ответ 2
Вот правильный способ проверки сертификата, поступающего с веб-сервера
- Клиент поддерживает список доверенных сертификатов CA ROOT
- Веб-серверы должны вернуть следующий сертификат сервера - обязательно
- Промежуточный сертификат - Обязательный сертификат ROOT CA - Не требуется/Дополнительно
Когда клиент подключается к серверу, он получает серверный сертификат и промежуточные сертификаты с сервера. Затем клиент создает цепочку доверия из сертификата сервера через промежуточный сертификат (сертификаты) в один из сертификатов CA ROOT, которым он доверяет. Сертификаты ROOT всегда самоподписываются - так что цепочка останавливается.
Вот простая команда для проверки сертификата веб-сервера с помощью openssl
openssl s_client -CAfile <root ca file> -quiet -showcerts -connect IP:PORT
В случае виртуального хостинга, где несколько сертификатов обслуживаются на одном IP: PORT, можно указывать имя сервера (SNI) с помощью -servername <FQDN>
. В противном случае будет отправлен сертификат по умолчанию.