Отладка проблем с сертификатами клиентов в IIS

У нас есть сервер IIS 2008R2, настроенный для сайта, настроенного на получение клиентских сертификатов. Наш тестовый клиент не работает, и мы пытаемся отладить почему.

В ходе этого мы установили новый блок Server 2008 R2 (да, я знаю, что он старый, но именно это и работает на программном обеспечении), чтобы попытаться выполнить репликацию или определить способы устранения неполадок.

Один из маршрутов, который мы исследуем, это рукопожатие TLS. Тестовое приложение написано в.NET и с соответствующими System.Diagnostics Отладка включена, это помещает следующую запись в файл журнала:

Информация System.Net: 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]

Как мы можем выяснить, какие сертификаты возвращаются сервером, и если мы обнаружим, что издатель отсутствует в списке, что могло помешать включению рута? Я не исключаю, что мы упустили что-то очевидное, но мы еще этого не видели.

0 ответов

Наконец-то мы нашли ответ на этот вопрос: виноват 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

Для этого выполните следующие действия:

  1. Запустить редактор реестра
  2. Найдите следующий подраздел реестра:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\AuthRoot
  3. Щелкните правой кнопкой мыши и удалите ключ, который называется "Сертификаты".
Другие вопросы по тегам