Authentication 403.7禁止在Owin自托管Web API 2中使用客户端证书身份验证

Authentication 403.7禁止在Owin自托管Web API 2中使用客户端证书身份验证,authentication,ssl,asp.net-web-api,client-certificates,owin,Authentication,Ssl,Asp.net Web Api,Client Certificates,Owin,长期读者,第一次海报 目标: 我们希望创建一个Owin自托管Web API 2服务,该服务专门使用客户端证书进行身份验证。出于开发目的,数据服务层将与客户端层在同一台计算机上运行 环境/配置: 已创建Web API 2数据服务。 这项服务并不复杂。它确实使用DelegatingHandler来验证客户端证书。 Web API 2服务已通过四种不同的方式“部署” 情节: IIS快车 此部署模式已正确配置。正在使用SSL证书,安全设置为。 非法移民 此模式还正确配置了SSL证书,并且需

长期读者,第一次海报

目标: 我们希望创建一个Owin自托管Web API 2服务,该服务专门使用客户端证书进行身份验证。出于开发目的,数据服务层将与客户端层在同一台计算机上运行

环境/配置:
  • 已创建Web API 2数据服务。
    这项服务并不复杂。它确实使用DelegatingHandler来验证客户端证书。

  • Web API 2服务已通过四种不同的方式“部署” 情节:
    • IIS快车
      此部署模式已正确配置。正在使用SSL证书,安全设置为


    • 非法移民
      此模式还正确配置了SSL证书,并且需要通过IIS管理器设置客户端证书。

    • “传统”Web API 2自托管控制台应用程序
      SSL证书已通过设置为“clientcertnegotiation=true”的netsh正确绑定到端口。
      配置已将ClientCredentialType设置为Certificate。

    • OWIN Web API 2自托管控制台应用程序
      SSL证书已通过netsh正确绑定到端口,设置为
      clientcertnegotiation=true


  • 客户端应用程序是一个WPF应用程序。
    对于服务调用,我们使用的是HTTPClient。
    操作顺序如下:

    WebRequestHandler=newwebrequesthandler();
    handler.ClientCertificateOptions=ClientCertificateOptions.Manual;
    handler.ClientCertificates.Add(MyCertificates.OfType).FirstOrDefault(cert=>cert.Thumbprint==SelectedCertificateThumbprint)作为X509Certificate2);
    handler.UseDefaultCredentials=true;
    HttpClient=新的HttpClient(处理程序);
    client.BaseAddress=SetServiceBaseAddress(客户端);
    var results=client.PostAsync(,mediaTypeFormatter).Result;
    
限制条件: 我们无权在这些机器上安装Wireshark或任何其他网络监控工具

行为:
  • 使用Fiddler代理IIS Express和IIS托管数据时 服务:
  • 由于SSL的名称不匹配,Fiddler将提示一个证书警告(我们尚未关闭此功能或为localhost.Fiddler生成一个)
  • Fiddler将提示“请求使用密钥的权限”。我们认为,这是一个基于Fiddler目录中存储的证书(.cer)访问当前用户\个人存储中存储的.pfx的请求,以便Fiddler使用适当的私钥对请求进行签名
  • 输入正确的密码后,请求成功。

  • 使用Fiddler代理Owin或“传统”自托管数据服务时:
  • 由于SSL的名称不匹配,Fiddler将提示一个证书警告(我们尚未关闭此功能或为localhost.Fiddler生成一个)
  • 立即收到403.7-禁止。

  • 使用所有四种主机模型而不使用Fiddler代理时:
  • 收到成功的响应
假设:
  • IIS和IISExpress中的“SslRequireCert”设置与自托管解决方案“clientcert”之间似乎存在行为差异
  • 客户端证书协商在自托管解决方案中正常工作,因为我们在不使用Fiddler的情况下正确接收证书(我们可以在调试器中正确拦截它)
  • 使用Fiddler与不使用代理之间的行为差异似乎与我们目前所看到的低层有关。我们现在将此归因于TCP握手
  • 问题:
  • SSL证书名称不匹配是否与客户端证书问题有关
  • 在自托管场景中,如何指定“SslNegotiateCert”和“SslRequireCert”之间的区别
  • OWIN托管模型中是否有特定的方式要求客户端证书
  • 在将数据服务配置为与IIS托管解决方案和自托管解决方案之间的行为相同时,我们是否忽略了特定的配置或设置
  • 我们的错误是否可能在其他地方,比如在客户端或Fiddler证书配置中

  • 我正忙于一个类似的问题,我想我偶尔也能找到你第二个问题的答案

    这完全是关于如何使用netsh工具将服务器证书绑定到端口

    clientnegotiation参数设置为enabled时,如下所示:

    netsh http add sslcert ipport=0.0.0.0:443 certhash=<cert_thumbprint> appid={some_guid} clientcertnegotiation=enable
    
    netsh http add sslcert ipport=0.0.0:443 certhash=appid={some_guid}clientcertnegotiation=enable
    
    ,OWIN主机开始要求客户端提供某种类型的客户端证书(可以是任何类型的证书)

    将该参数设置为禁用或忽略它时,OWIN主机不需要客户端提供任何信息

    netsh http add sslcert ipport=0.0.0.0:443 certhash=<cert_thumbprint> appid={some_guid} clientcertnegotiation=enable