Ошибка HTTP 403.16 - проблема доверия сертификата клиента

Я пытаюсь реализовать проверку подлинности сертификата клиента в IIS 8. Я развернул свою конфигурацию на компьютере разработчика и проверил, что она работает так, как ожидалось. Однако после настройки на сервере каждый раз, когда я перехожу на сайт и запрашиваю сертификат клиента, я выбираю его и сразу получаю ошибку 403.16. Журнал неудачных запросов выдает код ошибки 2148204809 и сообщение "Цепочка сертификатов обработана, но завершена корневым сертификатом, который не является доверенным поставщиком доверия".

У меня есть действующий сертификат клиента, а также действующий сертификат CA. Сертификат CA установлен в Trusted Root Authorities на учетной записи компьютера как на сервере, так и на клиентском компьютере, а сертификат клиента установлен в личной области учетной записи текущего пользователя на клиентском компьютере.

Сертификат клиента подписан непосредственно корневым центром сертификации, и, как я уже сказал, оба действительны. Других сертификатов в цепочке нет, а промежуточных сертификатов в зоне Trusted Root Authorities нет.

Конфигурация IIS имеет sslFlags = SslNegotiateCert и iisClientCertificateMappingAuthentication включена.

Сервер не настроен на отправку CTL, и у нас SendTrustedIssuerList = 0.

Я не понимаю, почему клиентскому сертификату нельзя доверять.

3 ответа

Решение

В Windows 2012 введены более строгие проверки хранилищ сертификатов. Согласно KB 2795828: внешняя служба Lync Server 2013 не может быть запущена в Windows Server 2012, хранилище доверенных корневых центров сертификации (т. Е. Корневых) может иметь только сертификаты, которые являются самозаверяющими. Если это хранилище содержит неподписанные сертификаты, проверка подлинности клиентских сертификатов в IIS возвращает код ошибки 403.16.

Чтобы решить эту проблему, вы должны удалить все неподписанные сертификаты из корневого хранилища. Эта команда PowerShell идентифицирует неподписанные сертификаты:

Get-Childitem cert:\LocalMachine\root -Recurse | 
    Where-Object {$_.Issuer -ne $_.Subject}

В моей ситуации мы переместили эти неподписанные сертификаты в хранилище промежуточных центров сертификации (например, CA):

Get-Childitem cert:\LocalMachine\root -Recurse | 
    Where-Object {$_.Issuer -ne $_.Subject} | 
    Move-Item -Destination Cert:\LocalMachine\CA

В соответствии с KB 2801679: проблемы связи SSL/TLS после установки KB 931125, у вас также может быть слишком много доверенных сертификатов.

[T] Максимальный размер списка доверенных центров сертификации, который поддерживает пакет безопасности Schannel, составляет 16 килобайт (КБ). Наличие большого количества сторонних корневых центров сертификации превысит ограничение в 16 КБ, и у вас возникнут проблемы со связью TLS/SSL.

Решение в этой ситуации состоит в том, чтобы удалить все сертификаты центра сертификации, которым вы не доверяете, или прекратить отправку списка доверенных центров сертификации, установив HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\@SendTrustedIssuerList запись реестра в 0 (по умолчанию, если не присутствует, 1).

В моем случае я добавлял корневой сертификат в хранилище сертификатов "текущий пользователь" на сервере и получал ошибку 403.16.

Добавление моего корневого сертификата в хранилище Trusted Root Authorities для локальной машины решило проблему.

Следуйте приведенным ниже инструкциям на сервере с IIS.

Для Windows Server 2008 R2:

  1. Щелкните правой кнопкой мыши файл сертификата и выберите "Установить сертификат". Нажмите кнопку "Далее.
  2. Выберите "Поместить все сертификаты в следующий магазин" и нажмите "Обзор..."
  3. Отметьте "Показать физические магазины"
  4. Разверните "Доверенные корневые центры сертификации" и выберите "Локальный компьютер". Нажмите ОК.
  5. Нажмите Далее / Нажмите Готово.

Для Windows Server 2012 R2:

  1. Щелкните правой кнопкой мыши файл сертификата и выберите "Установить сертификат".
  2. Выберите "Локальный компьютер". Нажмите кнопку "Далее.
  3. Выберите "Поместить все сертификаты в следующий магазин" и нажмите "Обзор..."
  4. Выберите "Доверенные корневые центры сертификации". Нажмите ОК.
  5. Нажмите Далее / Нажмите Готово.

Для Windows 7:

  1. Пуск -> Выполнить -> mmc.exe
  2. Файл -> "Добавить или удалить оснастки". Выберите "Сертификаты", нажмите "Добавить" и выберите "Учетная запись компьютера", а затем "Локальный компьютер". Нажмите Готово / ОК
  3. Разверните Сертификаты (локальный компьютер) -> Доверенные корневые центры сертификации -> Сертификаты. Щелкните правой кнопкой мыши на Сертификаты и выберите Все задачи -> Импорт.
  4. Выберите файл сертификата и нажмите "Далее".
  5. Выберите "Поместить все сертификаты в следующий магазин" и нажмите "Обзор..."
  6. Отметьте "Показать физические магазины"
  7. Разверните "Доверенные корневые центры сертификации" и выберите "Локальный компьютер". Нажмите ОК.
  8. Нажмите Далее / Нажмите Готово.

Я получил эту ошибку в IIS Express:

Ошибка HTTP 403.16 - запрещено

Ваш клиентский сертификат либо не является доверенным, либо является недействительным.

Глядя на TraceLogFiles Я увидел следующую ошибку:

<RenderingInfo Culture="en-US">
 <Opcode>MODULE_SET_RESPONSE_ERROR_STATUS</Opcode>
 <Keywords>
  <Keyword>RequestNotifications</Keyword>
 </Keywords>
 <freb:Description Data="Notification">BEGIN_REQUEST</freb:Description>
 <freb:Description Data="ErrorCode">A certificate chain processed, but terminated in a root certificate which is not trusted by the trust provider.
(0x800b0109)</freb:Description>
</RenderingInfo>

Оказалось, когда я установил Razer Synapse установка также поставить сертификат для chromasdk.io в доверенных корневых центрах сертификации под учетной записью компьютера -> Локальный компьютер. Я удалил это, и тогда все работало.

Просто поделился своим опытом работы с сервером Windows 2019 и IISExpress в сочетании с самозаверяющим сертификатом. Я не мог заставить его работать с редактированием реестра, и в конце концов мне это не понадобилось.

Следующие три шага привели меня туда:

  1. Создайте корневой сертификат для хранилища сертификатов localmachine с помощью powershell: $cert = New-SelfSignedCertificate -Type Custom -KeySpec Signature -Subject "CN=TestRootCert" -KeyExportPolicy Exportable -HashAlgorithm sha256 -KeyLength 2048 -CertStoreLocation "Cert:\LocalMachine\My" -KeyUsageProperty Sign -KeyUsage CertSign

  2. Сгенерируйте сертификат клиента для хранилища сертификатов localuser на основе корневого сертификата с помощью powershell: New-SelfSignedCertificate -Type Custom -Subject "CN=TestChildCert" -Signer $cert -TextExtension @("2.5.29.37={text}1.3.6.1.5.5.7.3.2","2.5.29.17={text}upn=test@local") -KeyUsage DigitalSignature -KeyAlgorithm RSA -KeyLength 2048 -CertStoreLocation "Cert:\CurrentUser\My"

  3. Переместите корневой сертификат из Personal\Certificates в Trusted Root Certification\Certificates

После этого я мог выбрать TestChildCert, и он был принят нормально.

Другие вопросы по тегам