HttpRequestMessage.GetClientCertificate () возвращает значение null в ASP DelegatingHandler веб-API - PullRequest
0 голосов
/ 16 июня 2020

У меня есть ASP Web Api (. Net Framework 4.6.1), который принимает сертификаты клиентов. Требуется отправить настраиваемое сообщение проверки в ответ на запрос с недействительным сертификатом. Например, если сертификат отсутствует, я должен отправить обратно «Сертификат клиента отсутствует», если проверка OCSP не удалась, я должен отправить обратно «Сертификат был отозван» и т. Д. c. Это код:

 public class CertificateMessageHandler : DelegatingHandler
{
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
            CancellationToken cancellationToken)
        {
             var certificate = request.GetClientCertificate();
        }
}

У меня есть клиентское приложение, в котором я выбираю, какой сертификат хочу использовать, и оно выполняет запрос к веб-приложению api (которое размещено на другом компьютере). Если сертификат действителен, то request.GetClientCertificates() возвращает сертификат, в противном случае, если срок действия сертификата истек или он самоподписан, request.GetClientCertificates() возвращает null.

Я отключил автоматическую c проверку CLR с помощью IIS:

netsh http show sslcert
netsh http delete sslcert ipport=0.0.0.0:443
netsh http add sslcert ipport=0.0.0.0:443 e104e... appid={4dc3e181-...} certstorename=My verifyclientcertrevocation=disable

Я установил:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\HTTP\Parameters\SslBindingInfo\0.0.0.0:443\DefaultSslCertCheckMode=1
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\SendTrustedIssuerList=0

Ни одна из вышеперечисленных настроек не работает.

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

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

EDIT : похоже, что модуль «IIS Web Core» проверяет сертификат из хранилища сертификатов до того, как IIS «перенаправит» запрос моему приложению:

введите описание изображения здесь

1 Ответ

0 голосов
/ 17 июня 2020

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

установите настройку iis SSL для принятия:

enter image description here

and set below code in web.config file:

  

Изменить:

Asp. net Core - это фреймворк, а Hostable Web Core (известный как HW C) - это новая концепция в IIS для размещения веб-сайта / веб-сервисов внутри вашего собственного процесса. Короче говоря, уменьшенная размещенная версия IIS (версия IIS express?). Это достигается путем вызова LoadLibrary для загрузки hwebcore.dll (% systemdrive% \ Windows \ System32 \ inetsrv \ hwebcore.dll)

Попробуйте отключить функцию Hostable Web Core, выполнив следующие шаги:

  • Откройте панель управления.

  • Нажмите «Включить или выключить Windows функции» на левой панели.

  • Найдите в списке хостовое веб-ядро Inte rnet Information Services (IIS) и снимите флажок.

enter image description here

restart iis after doing changes.

https://blogs.iis.net/sukesh/iis7-hosted-web-core-custom-service-webcoreservice

обратитесь к этим ссылкам ниже или более подробно:

HttpRequestMessage.GetClientCertificate () возвращает null в веб-API

Как использовать сертификат клиента для аутентификации и авторизации в веб-API

Аутентификация клиента для WebAPI 2

...