Отключите проверку сертификата клиента в IIS 10 для веб-сайта Asp.net, но разрешите приложению запрашивать входящий сертификат клиента

У меня есть веб-сайт API Asp.net, который выполняет пользовательскую проверку сертификата клиента. При размещении этого веб-сайта на IIS 10 я получаю следующее из журналов неудачных запросов при вызове своего API.

Цепочка сертификатов обработана, но завершена корневым сертификатом, который не является доверенным поставщиком доверия.

Мой web.config имеет

<configuration>
    <system.webServer>
        <access sslFlags="Ssl, SslRequireCert" /> 
    </system.webServer>

и в приложении Host.config у меня есть

<section name="access" overrideModeDefault="Allow" />

Что мне здесь не хватает? Как мне настроить IIS так, чтобы он просто проходил через сертификат и не проверял его?

Я хочу сделать это потому, что это тестовая среда, и я хочу доверить всем клиентам, которые вызывают мой API, свои самозаверяющие сертификаты. Я проведу внутреннюю проверку сертификата внутри моего API.

Примечание. Я разместил этот же веб-сайт в Azure AppService и установил для "Входящие клиентские сертификаты" значение ON. Оно работало завораживающе. Итак, какая разница, когда я размещаю его на своей машине IIS?

0 ответов

Мы используем клиентские сертификаты для проверки аппаратных устройств, подключающихся к нашему API. Для контекста, наши устройства снабжены сертификатом SSL на производстве, и этот сертификат подписывается нами самостоятельно. Когда устройство на свободе пытается подключиться к нашему API, мы обрабатываем проверку сертификата клиента в самом приложении.NET API.

Для этого требуются следующие настройки IIS SSL, а также ручной шаг по повторной привязке SSL-привязки (что мы делаем для очень специфических технических ограничений).

Итак, во-первых, в файле web.config у нас есть такая конфигурация:

  <security>
    <access sslFlags="Ssl" />
  </security>

Если мы добавим sslFlags SslNegotiateCert или SslRequireCert, то IIS попытается проверить сертификат клиента до того, как будет вызван код нашего приложения. Поэтому мы устанавливаем только флаг Ssl.

Во-вторых, в настройках SSL сайта IIS мы устанавливаем:

Требовать SSL [x]

Сертификат клиента:

[x] Игнорировать

[ ] Принять

[ ] Требовать

По сути, мы не просим IIS согласовывать клиентские сертификаты от нашего имени.

Последнее изменение конфигурации, которое мы вносим, ​​- это включить "Согласование сертификата клиента" в привязке SSL. По умолчанию при создании привязки SSL в IIS для свойства "Согласовать сертификат клиента" установлено значение false.

Насколько я понимаю, это означает, что IIS не будет согласовывать клиентские сертификаты при первоначальном согласовании TLS. Что произойдет, если требуются сертификаты клиентов, инициируется повторное согласование TLS, и сервер запросит сертификат клиента у клиента.

В нашем случае наши устройства передают сертификат клиента при первоначальном запросе и не обрабатывают повторное согласование TLS. Итак, включив "Согласование сертификата клиента", сертификаты клиента могут быть переданы в первоначальном запросе.

Таким образом, для повторной привязки привязки SSL требуется некоторая магия командной строки, чтобы найти текущую привязку, удалить ее и прочитать привязку на этот раз с включенным "Согласовать сертификат клиента".

Шаг 1. Найдите привязку SSL:

Выполните следующую команду в терминале CMD:

netshhttp показать sslcert > sslcerts.txt

Это перенесет все детали ваших текущих привязок SSL в sslcerts.txt.

Файл будет выглядеть следующим образом:

Привязки сертификатов SSL:

Hostname:port                : yourhostname:443
Certificate Hash             : your_certificate_hash
Application ID               : {your_applicationID_Guid}
Certificate Store Name       : My
Verify Client Certificate Revocation : Enabled
Verify Revocation Using Cached Client Certificate Only : Disabled
Usage Check                  : Enabled
Revocation Freshness Time    : 0
URL Retrieval Timeout        : 0
Ctl Identifier               : (null)
Ctl Store Name               : (null)
DS Mapper Usage              : Disabled
Negotiate Client Certificate : Disabled

Обратите внимание, что ваш файл sslcerts.txt будет содержать множество экземпляров этих привязок. Вам необходимо найти правильный вариант для приложения / сайта, с которым вы работаете.

Обратите внимание, что в приведенных выше выходных данных показано "Согласование сертификата клиента: отключено".

Шаг 2 - Удалите текущую привязку

Выполните следующую команду, чтобы удалить текущую привязку

netshhttp удалить sslcert hostnameport=yourhostname:443

Это удалит привязку SSL для сайта.

Шаг 3. Повторно привяжите SSL с включенным "Согласование сертификата клиента"

Выполните следующую команду в командной строке CMD:

netshhttp add sslcert hostnameport=yourhostname:443 certhash = your_certificate_hash appid = {your_applicationID_Guid} certstorename = MY verifyclientcertrevocation = Enable VerifyRevocationWithCachedClientCertOnly = Disable UsageCheckation =Enable clientcert

Обратите внимание, что здесь вы заполняете свойства привязки на основе сведений, полученных в sslcerts.txt, за исключением того, что вы устанавливаете clientcertnegotiation=Enable

Теперь у нас есть приложение IIS, которое будет согласовывать клиентский сертификат заранее, но не проверяет его и не позволяет нам проверять его в коде.

Затем мы используем AuthorizationFilterAttribute, чтобы получить сертификат клиента и проверить его на основе наших правил.

public class ValidateDeviceClientCertificateAttribute : AuthorizationFilterAttribute
{
    public override void OnAuthorization(HttpActionContext actionContext)
    {
        X509Certificate2 cert = actionContext.Request.GetClientCertificate();
        // Validation rules here i.e. check Hash of the signing cert, does it match your accepted value?
    }
}

При проверке у нас есть известный Промежуточный ЦС, который мы используем для подписи сертификатов наших устройств, поэтому мы проверяем, был ли сертификат клиента подписан этим Промежуточным сертификатом или хотя бы одним из промежуточных сертификатов, подписывающих наши устройства.

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