Ошибка 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:
- Щелкните правой кнопкой мыши файл сертификата и выберите "Установить сертификат". Нажмите кнопку "Далее.
- Выберите "Поместить все сертификаты в следующий магазин" и нажмите "Обзор..."
- Отметьте "Показать физические магазины"
- Разверните "Доверенные корневые центры сертификации" и выберите "Локальный компьютер". Нажмите ОК.
- Нажмите Далее / Нажмите Готово.
Для Windows Server 2012 R2:
- Щелкните правой кнопкой мыши файл сертификата и выберите "Установить сертификат".
- Выберите "Локальный компьютер". Нажмите кнопку "Далее.
- Выберите "Поместить все сертификаты в следующий магазин" и нажмите "Обзор..."
- Выберите "Доверенные корневые центры сертификации". Нажмите ОК.
- Нажмите Далее / Нажмите Готово.
Для Windows 7:
- Пуск -> Выполнить -> mmc.exe
- Файл -> "Добавить или удалить оснастки". Выберите "Сертификаты", нажмите "Добавить" и выберите "Учетная запись компьютера", а затем "Локальный компьютер". Нажмите Готово / ОК
- Разверните Сертификаты (локальный компьютер) -> Доверенные корневые центры сертификации -> Сертификаты. Щелкните правой кнопкой мыши на Сертификаты и выберите Все задачи -> Импорт.
- Выберите файл сертификата и нажмите "Далее".
- Выберите "Поместить все сертификаты в следующий магазин" и нажмите "Обзор..."
- Отметьте "Показать физические магазины"
- Разверните "Доверенные корневые центры сертификации" и выберите "Локальный компьютер". Нажмите ОК.
- Нажмите Далее / Нажмите Готово.
Я получил эту ошибку в 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 в сочетании с самозаверяющим сертификатом. Я не мог заставить его работать с редактированием реестра, и в конце концов мне это не понадобилось.
Следующие три шага привели меня туда:
Создайте корневой сертификат для хранилища сертификатов 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
Сгенерируйте сертификат клиента для хранилища сертификатов 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"
Переместите корневой сертификат из Personal\Certificates в Trusted Root Certification\Certificates
После этого я мог выбрать TestChildCert, и он был принят нормально.