![Ошибка SSL на веб-ферме Auzre с общей конфигурацией и централизованными сертификатами](https://rvso.com/image/1402624/%D0%9E%D1%88%D0%B8%D0%B1%D0%BA%D0%B0%20SSL%20%D0%BD%D0%B0%20%D0%B2%D0%B5%D0%B1-%D1%84%D0%B5%D1%80%D0%BC%D0%B5%20Auzre%20%D1%81%20%D0%BE%D0%B1%D1%89%D0%B5%D0%B9%20%D0%BA%D0%BE%D0%BD%D1%84%D0%B8%D0%B3%D1%83%D1%80%D0%B0%D1%86%D0%B8%D0%B5%D0%B9%20%D0%B8%20%D1%86%D0%B5%D0%BD%D1%82%D1%80%D0%B0%D0%BB%D0%B8%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D1%8B%D0%BC%D0%B8%20%D1%81%D0%B5%D1%80%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%82%D0%B0%D0%BC%D0%B8.png)
[Извините, если вопрос получился немного длинным, есть много дополнительной информации, если она имеет отношение к делу]
Обзор
У меня проблема с SSL на ферме с балансировкой нагрузки из 4 виртуальных машин в Azure. Если HTTPS-запрос поступает на первый сервер фермы, все в порядке. Если он поступает на любой из 3 других, то вызов завершается неудачей. Chrome выдает ошибку протокола SSL, IE и Firefox просто говорят, что страница не может быть отображена.
Установка
У меня есть четыре виртуальных машины Windows Server 2012 на Azure (небольшой экземпляр, просто для тестирования). Виртуальные машины находятся в одной облачной службе и наборе доступности. Конечные точки с балансировкой нагрузки были добавлены для портов 80 и 443 (прямой возврат сервераНЕТвключено на них). Все четыре машины были настроены с помощью одного и того же скрипта PowerShell и, за исключением двух, были полностью настроены таким образом.
Конфигурация IIS каждого сервера настроена на использование конфигурации общего ресурса, которая реплицируется через DFS на каждый сервер с первого сервера в группе. Это было настроено вручную для каждого сервера и работает нормально.
DFS также используется для репликации папки webs с первого сервера на остальные.
Я также обнаружил "новую" функцию Централизованных сертификатов после написания сценария развертывания, поэтому она была вручную установлена и настроена на четырех серверах. Я использую общий ресурс на отдельном сервере для хранения файлов сертификатов.
Запрос на сертификат был сгенерирован на первом сервере, и я использовал SSL.com, чтобы получить бесплатный 90-дневный SSL для адреса subdomain.domain.com
. Я добавил запись CNAME для subdomain
в DNS для domain.com
указания на адрес Azure cloudapp
.
Я импортировал сертификат SSL на первый сервер, затем экспортировал его снова как subdomain.domain.com.pfx
(с паролем) и скопировал его в общий доступ к файлам сертификата. При проверке централизованных сертификатов на всех четырех серверах они указывают сертификат в порядке без значков ошибок, указывающих на то, что пароль в конфигурации был неправильным и т. д.
Наконец, я изменил привязки сервера 1, добавив https с именем хоста subdomain.domain.com
и сТребовать указания имени сервераиИспользовать централизованное хранилище сертификатовпараметры проверены. Проверка других серверов показывает, что привязки распространяются так, как и ожидалось.
Проблема
Я добавил простую страницу, которая просто выдает имя сервера, на котором был обработан запрос. Если я запущу несколько окон IE, обращающихся к http://subdomain.domain.com
, они выведут множество имен серверов, показывая, что конфигурация IIS и веб-файлы развертываются правильно, а балансировка нагрузки Azure тоже делает свое дело. Что я нашел действительно крутым на самом деле.
Однако, когда я пробую это через HTTPS, все идет насмарку. Успешно выполняются только запросы, попавшие на первый сервер, остальные вылетают с сообщением «Эта страница не может быть отображена» или «Ошибка протокола SSL» в зависимости от того, с каким браузером я тестирую. На сервере 1 страница отображается нормально, сертификат виден, и ошибок сертификата нет.
Я уверен, что это проблема конфигурации на серверах, но я просто не могу сказать, что именно. Большая часть того, с чем я играю, для меня в новинку, так как в прошлом мы использовали физические некластеризованные серверы Windows 2003 с IIS6.
Что еще более озадачивает, так это то, что я отключил четыре виртуальные машины на ночь, а когда я перезапустил службу сегодня утром, оказалось, что сервер 2 теперь, по-видимому, отвечает на запросы SSL в дополнение к серверу 1. Однако, несмотря на это, вчера я тоже выполнил полное отключение, и после этого работал только сервер 1.
В файлах журнала IIS не отображаются неудачные запросы SSL, только несколько запросов 200 для порта 80 и смесь запросов 200 и 304 для порта 443 на серверах 1 и 2.
Я провел некоторую проверку с помощью поиска Google, но ничего не проливает свет. На самом деле, полная противоположность, насколько я могу судить, то, что я сделал, должно просто работать.
Любые советы, которые помогут решить эту проблему, будут приняты с благодарностью.
решение1
Я хотел бы поделиться некоторыми шагами, которые должны решить большинство проблем с централизованным хранилищем сертификатов на IIS. Централизованное хранилище сертификатов (CCS) создает поддельную привязку сертификата, которую оно использует для перенаправления запросов сертификатов SSL в CCS. Если эта привязка отсутствует или на одном IP-адресе есть несколько привязок, вы получите ошибки браузера, когда клиенты попытаются подключиться к веб-сайтам с поддержкой SSL.
Рассмотрим следующую настройку: сервер IIS с IP-адресом 172.16.0.41
и включенным централизованным хранилищем сертификатов содержит два домена; www.adomain.com
и www.bdomain.com
пакеты сертификатов .PFX устанавливаются в централизованном хранилище сертификатов IIS для каждого из доменов.
Обычно встречаются две ошибки;
ПРОБЛЕМА 1
Когда браузеры подключаются к веб-сайту, предоставляется неправильный сертификат. Например, при www.adomain.com
первом посещении предоставляется правильный сертификат, однако при посещении браузером возвращается www.bdomain.com
сертификат для www.adomain.com
, в результате чего браузер сообщает об ошибке недействительного сертификата.
РЕШЕНИЕ
Причиной этой проблемы обычно является то, что несколько веб-сайтов привязаны к одному и тому же IP-адресу и по крайней мере один из веб-сайтов не включилТребовать идентификацию имени сервера. Если этот параметр не включен для всех веб-сайтов, использующих один и тот же IP-адрес и порт, IIS не сможет определить, какой сертификат обслуживать, и поэтомупервый в победахполитика, по-видимому, применяется.
Это означает, что последующие запросы к другим веб-сайтам, размещенным на том же сервере IIS, возвращают неверный сертификат.
Шаги к решению
Убедитесь, что для каждого веб-сайта установлено значение
Require Server Name Identification
. Для этого щелкните по каждому веб-сайту в диспетчере IIS, выберите Привязки...->Выберите Привязку HTTPS->Выберите Изменить->ПроверитьRequire Server Name Identification
и убедитесь,Use Centralized Certificate Store
что также отмечено.Проверьте привязки на сервере. Из командной строки с повышенными правами выполните
netsh http show sslcert
Привязка для CCS должна присутствовать:
SSL Certificate bindings:
-------------------------
Central Certificate Store : 443
Certificate Hash : (null)
Application ID : {4dc3e181-e14b-4a21-b022-59fc669b0914}
Certificate Store Name : (null)
Verify Client Certificate Revocation : Enabled
Verify Revocation Using Cached Client Certificate Only : Disabled
Usage Check : Enabled
Revocation Freshness Time : 0
URL Retrieval Timeout : 0
Ctl Identifier : (null)
Ctl Store Name : (null)
DS Mapper Usage : Disabled
Negotiate Client Certificate : Disabled
Обратите внимание, что привязка с (null)
хэшем сертификата указывает на наличие привязки CCS pass through. Если есть какие-либо другие привязки, прослушивающие IP-адрес вашего сервера и порт SSL ( 172.16.0.41:443
в нашем сценарии), их необходимо удалить.
Чтобы удалить привязки, введите
netsh http delete sslcert <binding>
. В нашем сценарии это будет ,netsh http delete sslcert 172.16.0.41:443
и привязка должна быть удалена.(null)
Сквозная привязка CCS не должна быть удалена. Если эта привязка отсутствует, см.ПРОБЛЕМА 2ниже.Сбросьте iis
iisreset
и подключитесь к каждому домену на веб-сервере. Правильный сертификат должен быть общим. Вы также можете проверить привязки, повторив шаг 2 и убедившись, что нет никаких конкретныхIP:PORT
привязок к вашему порту SSL и IP веб-сервера.
ПРОБЛЕМА 2
Даже после подтверждения того, что централизованное хранилище сертификатов включено, имеет видимость сертификатов и все веб-сайты обязаны его использовать, когда браузер подключается к веб-сайту, он выдает ошибку Page Cannot be displayed
или invalid encryption
. Предполагаемый веб-сайт не отображается.
В IE (Edge) это обычно проявляется в виде предложения проверить, включены ли в браузере соответствующие типы шифрования.
Перезагрузка iisreset
сервера не решает проблему.
РЕШЕНИЕ
Похоже, это ошибка в создании сквозной привязки CCS. Она не создается на веб-сервере, когда включена функциональность CCS, так что входящие запросы на сертификат молча отбрасываются.
Шаги к решению
Сначала проверьте, что централизованное хранилище сертификатов включено и может видеть все сертификаты на своем пути. Для этого выберите
IISManager
узел сервера->Централизованные сертификаты (в разделе Управление)->Изменить параметры функций.. и убедитесь, что оно настроено и включено.Проверьте, что все веб-сайты, использующие общие сертификаты, привязаны к CCS. Для этого щелкните по каждому веб-сайту в диспетчере IIS, выберите Привязки...->Выберите Привязку HTTPS->Выберите Изменить->Проверить
Require Server Name Identification
и убедитесь,Use Centralized Certificate Store
что также отмечено.Проверьте, что привязка CCS создана. Запустите
netsh http show sslcert
. Если результаты пустые или(null)
сертификат сквозной передачи отсутствует (см. шаг 2 в ПРОБЛЕМЕ 1, чтобы узнать, как выглядит привязка CCS), привязка CCS не была включена.SSL Certificate bindings: -------------------------
В диспетчере IIS выберите один веб-сайт, который использует CCS, щелкните Привязки...->Выберите Привязку HTTPS->Выберите Изменить->иснимите отметку
Use Centralized Certificate Store
иснимите отметкуRequire Server Name Identification
.
В SSL certificate
раскрывающемся списке выберите сертификат сервера по умолчанию WMSVC
и нажмите OK
. Оставьте Site Bindings
окно открытым.
Вернитесь в командную строку с повышенными привилегиями и запустите
netsh http show sslcert
. Это должно привести к такой привязке:SSL Certificate bindings: ------------------------- IP:port : 172.16.0.41:443 Certificate Hash : 64498c920fecb31b8f7ccbdac2fa2baa2ec4f19a Application ID : {4dc3e181-e14b-4a21-b022-59fc669b0914} Certificate Store Name : My Verify Client Certificate Revocation : Enabled Verify Revocation Using Cached Client Certificate Only : Disabled Usage Check : Enabled Revocation Freshness Time : 0 URL Retrieval Timeout : 0 Ctl Identifier : (null) Ctl Store Name : (null) DS Mapper Usage : Disabled Negotiate Client Certificate : Disabled
Вернитесь в
Site Bindings
окно и отмените изменения, внесенные на шаге 4. ВключитеRequire Server Name Indication
иUse Centralized Certificate Store
нажмитеOK
.Вернитесь в командную строку с повышенными привилегиями и запустите ее
netsh http show sslcert
еще раз, и — если боги вам улыбнутся — привязка централизованного хранилища сертификатов должна появиться, заменив текущую привязку:SSL Certificate bindings: ------------------------- Central Certificate Store : 443 Certificate Hash : (null) Application ID : {4dc3e181-e14b-4a21-b022-59fc669b0914} Certificate Store Name : (null) Verify Client Certificate Revocation : Enabled Verify Revocation Using Cached Client Certificate Only : Disabled Usage Check : Enabled Revocation Freshness Time : 0 URL Retrieval Timeout : 0 Ctl Identifier : (null) Ctl Store Name : (null) DS Mapper Usage : Disabled Negotiate Client Certificate : Disabled
Если вы видите привязку сертификата выше со (null)
значением, Certificate Hash
значит, она сработала, и теперь сквозная передача CSS должна быть включена.
- Запустите браузер и попробуйте подключиться к доменам на сервере через защищенный сокет (HTTPS). Все должно быть хорошо.
Важные заметки
Вам нужно повторить этот процесс на каждом веб-сервере в вашей веб-ферме. Это должно быть выполнимо через PowerShell для автоматизации и проверки процесса.
После создания сквозной привязки она будет сохраняться неограниченное время (если только вы не отключите поддержку централизованных сертификатов на узле).
Кстати, по этой ссылке вы найдете информацию о том, как работает CCS на техническом уровне, и ее стоит прочитать:https://blogs.msdn.microsoft.com/kaushal/2012/10/11/central-certificate-store-ccs-with-iis-8-windows-server-2012/
Надеюсь, это поможет.