У нас есть сервер IIS 2008R2 с сайтом, настроенным для запроса клиентских сертификатов. Наш тестовый клиент не работает, и мы пытаемся выяснить, почему.
В ходе этого мы установили новый сервер Server 2008 R2 (да, я знаю, что он старый, но это то, что запускает программное обеспечение), чтобы попытаться воспроизвести или определить способы устранения неполадок.
Один из способов, который мы исследуем, - это рукопожатие TLS. Тестовое приложение написано на .NET, и при включенной отладке System.Diagnostics
в файл журнала помещается следующая запись:
System.Сетевая информация: 0: [22724] SecureChannel # 48979325 - У нас есть предоставленные пользователем сертификаты. Сервер указал 10 эмитентов. Ищем сертификаты, соответствующие любому из издателей.
Мы не можем увидеть этот список эмитентов, поэтому мы взломали OpenSSL. Выполнение следующей команды:
openssl s_client -connect win2k8r2-1.hsl10690.test:443 -state -no_ticket -servername win2k8r2-1.hsl10690.test
Результат:
[...]
-----END CERTIFICATE-----
subject=/CN=testcert.hsl10690.test
issuer=/CN=Internal Dev CA 1
---
No client certificate CA names sent
---
SSL handshake has read 1013 bytes and written 329 bytes
[...]
Итак, у нас есть несоответствие, когда стек Microsoft объявил, что сервер указал 10 эмитентов, но OpenSSL сообщает, что сервер не отправил имена CA.
В случае действующей системы журнал System.Diagnostics сообщает о 130 с лишним эмитентах, указанных сервером, но OpenSSL по-прежнему возвращает ноль.
Мы считаем, что проблема в том, что поставляемый нами сертификат клиента не соответствует одному из издателей (но мы подтвердили, что корень находится в хранилище доверенных сертификатов сервера, и мы проверили сертификат вне сервер). На активном сервере мы видим это в журналах после сообщения « Сервер указал ... »:
System.Net Information: 0 : [36484] SecureChannel#33675143 - We have user-provided certificates. The server has specified 133 issuer(s). Looking for certificates that match any of the issuers.
ProcessId=20372
DateTime=2018-12-20T13:33:39.9042036Z
System.Net Information: 0 : [36484] SecureChannel#33675143 - Left with 0 client certificates to choose from.
ProcessId=20372
DateTime=2018-12-20T13:33:39.9052036Z
во время тестирования, где все работает, он говорит:
System.Net Information: 0 : [22724] SecureChannel#48979325 - We have user-provided certificates. The server has specified 10 issuer(s). Looking for certificates that match any of the issuers.
ProcessId=22100
DateTime=2018-12-21T13:52:23.3718249Z
System.Net Information: 0 : [22724] SecureChannel#48979325 - Selected certificate: [Version]
V3
[Subject]
Как мы можем найти какие сертификаты возвращаются сервером, и если мы обнаружим, что издатель отсутствует в списке, что могло помешать включению корневого каталога? Не исключаю, что мы упустили что-то очевидное, но мы этого еще не видели.
Мы наконец нашли ответ на этот вопрос: виноват KB931125. В статье блога описывается, что база знаний предназначена только для целей клиентов, но была отправлена на серверы, что приводит к усечению списка CA, отправляемого IIS. Это на самом деле не объясняет, почему мы не могли увидеть переданный список CA с помощью OpenSSL, но в конечном итоге это привело нас к основной причине.
Статья в блоге указывает на дополнительную статью MSDN , в которой проблема описывается более подробно:
Эти проблемы могут возникнуть, если сервер TLS / SSL содержит много записей в список доверенных корневых сертификатов. Сервер отправляет список доверенные центры сертификации для клиента, если следующие условия верны:
- Сервер использует безопасность транспортного уровня (TLS) / протокол SSL для шифрования сетевого трафика.
- Клиентские сертификаты требуется для аутентификации во время рукопожатия аутентификации процесс.
Этот список доверенных центров сертификации представляет органы, от которых сервер может принимать сертификат клиента. К быть аутентифицированным сервером, клиент должен иметь сертификат который присутствует в цепочке сертификатов к корневому сертификату из списка серверов. Это потому, что сертификат клиента всегда сертификат конечного объекта в конце цепочки. Клиент сертификат не является частью цепочки.
В настоящее время максимальный размер доверенных центров сертификации список, который поддерживает пакет безопасности Schannel, составляет 16 КБ в Windows Server 2008, Windows Server 2008 R2 и Windows Server 2012.
В журнал событий также записывается запись (которую мы пропустили при первом просмотре):
При запросе аутентификации клиента этот сервер отправляет список доверенные центры сертификации для клиента. Клиент использует это список, чтобы выбрать сертификат клиента, которому доверяет сервер. В настоящее время этот сервер доверяет такому количеству центров сертификации, что список слишком длинный. Таким образом, этот список был усечен. В администратор этой машины должен просмотреть сертификат органы, которым доверяют аутентификацию клиентов, и удаляют те, которые делают на самом деле не нужно доверять.
В статье MSDN перечислено исправление:
Удалите следующий раздел реестра:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ SystemCertificates \ AuthRoot \ Certificates
Для этого выполните следующие действия:
- Запустите реестр Редактор
- Найдите следующий подраздел реестра: HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ SystemCertificates \ AuthRoot
- Щелкните правой кнопкой мыши и затем удалите раздел, который называется «Certificates»