Apache сертификаты для некоторых URL не работают
У нас довольно странная проблема с установкой Apache. Вот краткое резюме:
В настоящее время я устанавливаю Apache с https и сертификатами сервера. Это довольно просто и работает прямо из коробки - как и ожидалось. Это конфигурация для этой настройки:
Listen 443
SSLEngine on
SSLCertificateFile "/progs/apache/ssl/example-site.no.pem"
SSLCertificateKeyFile "/progs/apache/ssl/example-site.no.key"
SSLCACertificateFile "/progs/apache/ssl/ca/example_root.pem"
SSLCADNRequestFile "/progs/apache/ssl/ca/example_intermediate.pem"
SSLVerifyClient none
SSLVerifyDepth 3
SSLOptions +StdEnvVars +ExportCertData
RequestHeader set ssl-ClientCert-Subject-CN "%{SSL_CLIENT_S_DN}s"
RewriteEngine On
ProxyPreserveHost On
ProxyRequests On
SSLProxyEngine On
...
<LocationMatch /secureStuff/$>
SSLVerifyClient require
Order deny,allow
Allow from All
</LocationMatch>
...
<Proxy balancer://exBalancer>
Header add Set-Cookie "EX_ROUTE=EB.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
BalancerMember http://10.0.0.1:7200 route=ee1 retry=300 flushpackets=off keepalive=on
BalancerMember http://10.0.0.2:7200 route=ee2 retry=300 flushpackets=off keepalive=on status=+H
ProxySet stickysession=EX_ROUTE scolonpathdelim=Off timeout=10 nofailover=off failonstatus=505 maxattempts=1 lbmethod=bybusyness
Order deny,allow
Allow from all
</Proxy>
RewriteCond %{REQUEST_URI} !^/index.html [NC]
RewriteRule ^/(.*)$ balancer://exBalancer/$1 [P,NC]
ProxyPassReverse / balancer://exBalancer/
Header edit Set-Cookie "(.*)" "$1;HttpsOnly"
...
Итак, все работает нормально и, как и ожидалось, для всех страниц, которые не являются частью директивы LocationMatch.
При запросе чего-либо, соответствующего директиве LocationMatch, меня спрашивают о сертификате (отсюда и обязательный атрибут SSLVerifyClient) - и я получаю все правильные сертификаты в моем браузере, основанные на корневой / промежуточной цепочке. После выбора сертификата и нажатия кнопки "ОК" в журналах apache появляется следующее:
[ssl: info] [pid 9530: tid 25] [client: 43357] AH01998: Соединение закрыто для ребенка 86 с аварийным отключением ( [Чт, 11 октября 09:27:36.221876 2012] [ssl:debug] [pid 9530:tid 25] ssl_engine_io.c(1171): (70014) Конец файла найден: [клиент 10.235.128.55:45846] AH02007: SSL-рукопожатие прервано системой [Подсказка: в браузере нажата кнопка Stop?!]
И это просто спам логов. Что здесь происходит? Я вижу, как эта конфигурация работает на моей локальной машине, но не на одном из наших серверов. Между серверами нет различий в конфигурации, только незначительные изменения в приложениях.
Я пробовал следующее: 1) Удаление проверки CA-сертификата (работает) 2) Добавление необходимого CA-сертификата для всего сайта (работает) 3) Добавление "SSLVerifyClient необязательно" не работает 4) ++
Информация о сервере / приложении
Местный:
-OpenSSL v.1.0.1x -Apache 2.4.3 -Ubuntu -mpm: событие -все настройки должны быть включены
(отказавший) сервер:
-OpenSSL 0.9.8e -Apache 2.4.2 -SunOS -mpm: worker -все настройки должны быть включены
Пожалуйста, дайте мне знать, если потребуется дополнительная информация, я предоставлю ее немедленно.
Краткая сводка:
-Running Apache 2.4 -Серверные сертификаты работают просто отлично -Клиентские сертификаты для некоторых /Locations не работает, не работает с ошибками
PS:
Может ли это быть связано с версией OpenSSL и материалом "Renegotiation", связанным с TLS/SSLv3?
1 ответ
Кажется, есть проблема с версией apache, скомпилированной для используемой нами ОС Sun. Это объясняется здесь: - http://svn.apache.org/viewvc?view=revision&revision=1373439
В дополнение к этому, мы просто выполнили обновление до openssl v1.0.1c, которое исправило некоторые другие проблемы.
Подводя итоги: если вы используете Sun OS и Apache 2.4.0, 2.4.1 или 2.4.2, то вам необходимо выполнить обновление до версии 2.4.3, поскольку проблема с SSLCaching там решена.
Ресурсы: