Я пытаюсь настроить проверку подлинности сертификата клиента для веб-службы, работающей на Rails. Служба работает на apache2, пассажирском и mod_ssl. Мне удалось успешно сгенерировать ключи и настроить аутентификацию сертификата клиента для всего домена. Это работает нормально, однако, когда я пытаюсь включить директиву Location, я всегда получаю эту ошибку (от браузеров и клиента Ruby):
SSL_connect returned=1 errno=0 state=SSLv3 read finished A: sslv3 alert handshake failure (OpenSSL::SSL::SSLError).
Когда я запускаю команду из curl, я получаю эту ошибку:
curl: (52) Empty reply from server
Я удаляю директиву, и она работает нормально. Вот как выглядит мое признание этого виртуального хоста.
<VirtualHost *:443 *:80>
ServerName wrangler.optimis.local
DocumentRoot "/Users/jmoore/Sites/data-wrangler/public/"
RackEnv development
ErrorLog "/Users/jmoore/Sites/data-wrangler/log/error.log"
CustomLog "/Users/jmoore/Sites/data-wrangler/log/access.log" common
SetEnv GEM_HOME /Users/jmoore/.rvm/gems/ree-1.8.7-2010.02
SetEnv GEM_PATH /Users/jmoore/.rvm/gems/ree-1.8.7-2010.02
# Enable SSL on this domain
SSLEngine on
SSLProtocol ALL
SSLCipherSuite HIGH:MEDIUM
SSLCertificateFile /etc/apache2/ssl.key/new/wrangler_servercert.pem
SSLCertificateKeyFile /etc/apache2/ssl.key/new/wrangler_server.nopass.key
# Enable SSL client certificates, but disable verification for the entire domain (we only want it on specific URLs)
#SSLCACertificatePath /etc/apache2/ssl.key/new/demoCA
SSLCACertificateFile /etc/apache2/ssl.key/new/demoCA/cacert.pem
#SSLCertificateChainFile /etc/apache2/ssl.key/new/demoCA/cacert.pem
#SSLVerifyClient require
SSLVerifyClient none
#SSLVerifyDepth 1
<Location /test>
SSLVerifyClient require
SSLVerifyDepth 1
</Location>
</VirtualHost>
Мое исследование показало, что это обычно вызвано плохими сертификатами, поэтому я регенерировал сертификаты несколько раз, и каждый раз он работал нормально для всего домена, но выдает ошибку рукопожатия, когда я пытаюсь ограничиться только одним местоположением. Поскольку эти конфигурации предлагаются в документации apache, я не уверен, что происходит не так. Кто-нибудь знает, как решить проблему рукопожатия, которая возникает, когда вы пытаетесь ограничить аутентификацию клиента одним местом?
Проблема в директиве SSLVerifyClient. Если он находится внутри местоположения или каталога, вы столкнетесь с этой проблемой. Требование SSLVerifyClient и SSLVerifyDepth должны быть установлены на уровне виртуального хоста.
Поддерживает ли ваш сервер расширение повторного согласования TLS (RFC 5746)? Есть ли у него версия OpenSSL, которая полностью блокирует повторное согласование (это было временное исправление для CVE-2009-3555)?
Если SSLVerifyClient
ограничивается Location, это влечет за собой второе рукопожатие для повторного согласования клиентского сертификата. Именно здесь возникла проблема безопасности в SSL / TLS (CVE-2009-3555) и что исправлено в RFC 5746 (при условии, что клиент также поддерживает это).
Подробнее о версиях в этот ответ StackOverflow.