Я пытался создать веб-сайт с двусторонним 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, но я рад, что у меня есть рабочее решение.