Назад | Перейти на главную страницу

Подключение к веб-серверу с двусторонним SSL не запрашивает сертификат ни в одном браузере и возвращает ошибку 403.7.

Я пытался создать веб-сайт с двусторонним SSL в IIS 10. Все идет не так хорошо.

У меня уже есть домен, который я получил через NameCheap, и DNS через CloudFlare (только DNS, без прокси).

На сервере есть сертификат для этого домена, который я получил через Certify with Let's Encrypt.

На этом сервере я установил AD CS и использовал его для создания центра сертификации.

CA Web Enrollment активен и принимает запросы только от VPN-соединения, настроенного через RRAS (я не хотел, чтобы оно открывалось для Интернета, и, кстати, VPN-соединение использует сертификат, который я получил ранее, так что он работает правильно).

Клиентский ПК запустил сертификат и отправил его на сервер с помощью CA Web Enrollment через VPN. Затем этот запрос был отправлен, и полученный сертификат и ЦС были импортированы в хранилища CurrentUser \ My, LocalMachine \ TrustedRoot соответственно. Я также проверил, что у сертификата клиента есть закрытый ключ.

Пока ситуация с сертификатами такая:

-Сервер: CA (LocalMachine \ TrustedRoot (без ключа) и LocalMachine \ My (ключ)), сертификат сервера (LocalMachine \ My (ключ)).

-Client: CA (LocalMachine \ TrustedRoot (без ключа)), сертификат клиента (CurrentUser \ My (ключ)).

Затем идет настройка IIS: на сервере три сайта. 1-й - это приложение по умолчанию для приложения certsrv, которое прослушивает только IP-адрес VPN и localhost и имеет только HTTPS, активный с сертификатом сервера (порты 443 оба). Второй - FTP-сайт, который прослушивает только IP-адрес VPN и порт 21. Это не имеет значения, я упоминаю их только потому, что не хочу ничего упускать.

3-й - тот, о котором мы заботимся. Он прослушивает доменное имя, любой IP-адрес и имеет активные HTTP и HTTPS (оба с портами 80 и 443 соответственно). HTTP активен только поэтому URL Rewrite может перенаправить его на HTTPS, а HTTPS использует сертификат сервера.

На этом сайте включен обязательный SSL и клиентские сертификаты.

В Аутентификации все методы отключены.

В system.webServer / security / authentication / iisClientCertificateMappingAuthentication я установил Enabled на true, а manyToOneCertificateMappingsEnabled на true. Внутри manyToOneMappings у меня есть один элемент, сопоставленный с пользователем на сервере, а внутри правил у меня есть один с certificateField = Issuer, certificateSubField = CN и matchCriteria = "имя созданного мной ЦС".

Раздел реестра с именем SendTrustedIssuerList со значением 1 был создан внутри Computer \ HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ SCHANNEL.

Сертификат сервера был удален и повторно добавлен с clientcertnegotiation = enabled к домену: 443 привязка на сайте с помощью netsh в powershell.

Наконец, я использовал IISCrypto из https://www.nartac.com/Products/IISCrypto/ для настройки протоколов внутри Computer \ HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ SCHANNEL \ Protocols.

Это все, что я сделал до сих пор, и он должен охватывать все ответы на аналогичные проблемы во всем Интернете, но все, что он делает, это дает мне ошибку 403.7. Я использовал wirehark для проверки трафика TLS во время попытки подключения, и сервер, похоже, отправляет сертификат запроса со списком доверенных ЦС (мой ЦС включен в список), но я не могу заставить ни один браузер запрашивать у меня сертификат клиента . О, забыл упомянуть, что я добавил сертификаты CA и клиента через браузеры, а IE 11 имеет de Не запрашивать, если у вас отключен только один параметр cerrificate, но все равно ничего.

Любые идеи?

В конце концов, все заработало. IIS был настроен правильно, проблема заключалась в сертификатах, не знаю почему, но браузерам они не понравились. Поэтому я удалил AD CS с сервера и переделал CA и сертификат клиента с помощью PowerShell. Эти новые сертификаты работают нормально, и все браузеры запрашивают их у меня, когда помещают их туда, куда им нужно.

Кстати, команды PowerShell были следующими:

$params = @{
   DnsName = "CA Name"
   KeyLength = 2048
   KeyAlgorithm = 'RSA'
   HashAlgorithm = 'SHA256'
   KeyExportPolicy = 'Exportable'
   NotAfter = (Get-Date).AddYears(5)
   CertStoreLocation = 'Cert:\LocalMachine\My'
   KeyUsage = 'CertSign','CRLSign'
}

$rootCA = New-SelfSignedCertificate @params

Export-Certificate -Cert $rootCA -FilePath "C:\path\to\file\ca-public.crt"

Import-Certificate -CertStoreLocation 'Cert:\LocalMachine\Root' -FilePath "C:\path\to\file\ca-public.crt"

$params = @{
   Subject = "Client Name"
   Signer = $rootCA
   KeyLength = 2048
   KeyAlgorithm = 'RSA'
   HashAlgorithm = 'SHA256'
   KeyExportPolicy = 'Exportable'
   NotAfter = (Get-date).AddYears(5)
   CertStoreLocation = 'Cert:\LocalMachine\My'
}

$clientCert = New-SelfSignedCertificate @params

Export-PfxCertificate -Cert $clientCert -FilePath "C:\path\to\file\client-private.pfx" -Password (ConvertTo-SecureString -AsPlainText 'password' -Force)

Затем вам просто нужно импортировать сертификаты в соответствующие хранилища на клиентской машине.

Не знаю, чего не хватало в сертификатах, созданных с помощью AD CS, но я рад, что у меня есть рабочее решение.