【问题标题】:HttpRequestMessage.GetClientCertificate() returns null in ASP Web API DelegatingHandlerHttpRequestMessage.GetClientCertificate() 在 ASP Web API DelegatingHandler 中返回 null
【发布时间】:2020-06-16 05:59:10
【问题描述】:

我有一个接受客户端证书的 ASP Web Api (.Net Framework 4.6.1)。要求是在具有无效证书的请求的响应中发送自定义验证消息。 例如,如果证书丢失,我应该发回“客户端证书丢失”,如果 OCSP 验证失败,我应该发回“证书已被撤销”等。 这是代码:

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

我有一个客户端应用程序,我可以在其中选择要使用的证书,它会向 Web api 应用程序(托管在另一台机器上)发出请求。如果证书有效,则request.GetClientCertificates()返回证书,否则,如果证书过期或自签名,request.GetClientCertificates()返回null。

我已禁用 IIS 的自动 CLR 验证:

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

以上设置均无效。

注意:使用 Web 应用程序的第 3 方可能会发送自签名证书,业务逻辑应拒绝此类证书的请求,因此包含使用的 CA无法在受信任的根存储中签署证书。

感谢任何有关如何从请求中获取客户端证书的帮助。

编辑:在 IIS 将请求“转发”到我的应用程序之前,模块“IIS Web Core”似乎根据证书存储方式验证证书:

【问题讨论】:

    标签: asp.net iis ssl-certificate webapi


    【解决方案1】:

    您可以尝试检查以下设置:

    将 iis SSL 设置设置为接受:

    并在 web.config 文件中设置以下代码:

    <iisClientCertificateMappingAuthentication enabled="true">
                </iisClientCertificateMappingAuthentication>
    

    编辑:

    Asp.net Core 是一个框架,Hostable Web Core(称为 HWC)是 IIS 中的一个新概念,用于在您自己的进程中托管网站/Web 服务。简而言之,一个较小的 IIS 托管版本(IIS 速成版?)。 这是通过调用 LoadLibrary 来加载 hwebcore.dll (%systemdrive%\Windows\System32\inetsrv\hwebcore.dll) 来完成的

    尝试按照以下步骤禁用 Hostable Web Core 功能:

    • 打开控制面板。

    • 点击左侧窗格中的“打开或关闭 Windows 功能”。

    • 从列表中找到 Internet 信息服务 (IIS) 可托管 Web 核心并取消选中该复选框。

    修改后重启iis。

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

    请参考以下链接或更多详细信息:

    HttpRequestMessage.GetClientCertificate() returns null in Web API

    How to use a client certificate to authenticate and authorize in a Web API

    Client Authentication for WebAPI 2

    【讨论】:

    • 感谢您的回答,但是Require SSL 和Accept 已经设置好了,否则我什至无法收到有效的证书。 iisClientCertificateMappingAuthentication 启用从一个客户端证书到一个或多个帐户的映射,但这是在 IIS 内部验证证书之后发生的,因此此设置无用。
    • @TeoMor 尝试从 windows 打开和关闭功能禁用 iis 可托管 Web 核心 image
    • 应用是 ASP Web API,不是 ASP .NET Core,所以设置无效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 2021-06-11
    • 1970-01-01
    • 2020-03-07
    • 2020-02-05
    相关资源
    最近更新 更多