2009-09-21 8 views
33

Мое приложение использует SSL для безопасного соединения с сервером, и у него возникают проблемы с проверкой цепочки сертификатов. Цепочка выглядит следующим образом:Неисправность понимания Проверка цепочки сертификатов SSL

Entrust.net Secure Центр сертификации сервера -> DigiCert Global CA -> * .ourdomain.com

Мы используем магазин сертификата вытащил из Mozilla. Он содержит сертификат Entrust.net, но не DigiCert Global CA.

Я понимаю, что промежуточный орган не должен доверять, пока корневая власть, но проверка неудачна:

% 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, не всегда будут поставляться с копией каждого сертификата, который ему когда-либо понадобится. Там всегда будут новые центры сертификации, и необходимо использовать защиту корневого сертификата, чтобы убедиться, что все промежуточные центры сертификации действительны. Правильно? Так как делает эта работа? Неужели это так глупо, как кажется?

+0

В OpenBSD, '-CAfile' может быть установлен в'/etc/ssl/cert.pem'. –

ответ

16

Промежуточные сертификаты должны быть установлены на ваших веб-серверах, а также сертификаты для вашего собственного домена. У меня была такая же проблема на прошлой неделе ... Firefox кажется более придирчивым, чем остальные браузеры об этом.

+4

Ага ... Хорошо. Спасибо за понимание Дэвида. Для тех, кто приезжает сюда из Google, ключевым словом для настройки apache является SSLCertificateChainFile. См. Это (от самого DigiCert!) http://www.digicert.com/ssl-certificate-installation-apache.htm –

+0

Самое удивительное. Спасибо, Джош, это очень помогло мне. – 0xCAFEBABE

6

Вот правильный способ проверить certficate приходя с веб-сервера

  • Client поддерживает список доверенных корневых сертификатов CA
  • Web-серверы должны возвращать следующий сертификат сервера - Обязательный
  • Промежуточный сертификат (ы) - Обязательный сертификат ROOT CA - Не требуется/Дополнительно

Когда клиент подключен к серверу, он получает сертификат сервера и посредник (ы) с сервера. Затем клиент создает цепочку доверия из сертификата сервера через промежуточный сертификат (сертификаты) в один из сертификатов CA ROOT, которым он доверяет. Сертификаты ROOT всегда самоподписаны - так что цепочка останавливается.

Вот простая команда, чтобы проверить сертификат веб-сервера с помощью OpenSSL

openssl s_client -CAfile <root ca file> -quiet -showcerts -connect IP:PORT 

В случае виртуального хостинга, где несколько сертификатов служил на том же IP: PORT, указания имени сервера (SNI) может можно использовать с помощью -servername <FQDN>. В противном случае будет отправлен сертификат по умолчанию.