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

标签 authentication ssl asp.net-web-api client-certificates owin

长期读者,第一次海报。

目标:

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

环境/配置:

  • 已创建 Web API 2 数据服务。

    该服务没有什么复杂的。它确实使用 DelegatingHandler 来验证客户端证书。
  • Web API 2 服务已通过四种不同的方式“部署”
    场景:
  • IIS Express

    此部署模式已正确配置。正在使用 SSL 证书并且安全性设置为 <access sslFlags="Ssl, SslRequireCert"/>
  • IIS

    此模式也已使用 SSL 证书正确配置,并且需要通过 IIS 管理器设置客户端证书。
  • "Legacy"Web API 2 自托管控制台应用程序

    SSL 证书已通过 netsh 正确绑定(bind)到端口,设置为“clientcertnegotiation=true”。

    配置已将 ClientCredentialType 设置为 Certificate。
  • OWIN Web API 2 自托管控制台应用程序

    SSL Cert 已经通过 netsh 正确绑定(bind)到端口,设置为 clientcertnegotiation=true
  • 客户端应用程序是 WPF 应用程序。

    对于服务调用,我们使用 HTTPClient。
    操作顺序为:
        WebRequestHandler handler = new WebRequestHandler();
        handler.ClientCertificateOptions = ClientCertificateOption.Manual;
        handler.ClientCertificates.Add(MyCertificates.OfType<X509Certificate2>).FirstOrDefault(cert => cert.Thumbprint == SelectedCertificateThumbprint) as X509Certificate2);
        handler.UseDefaultCredentials = true;
        HttpClient client = new HttpClient(handler);
        client.BaseAddress = SetServiceBaseAddress(client);
        var results = client.PostAsync(<RequestURI>, <RequestDTO>, mediaTypeFormatter).Result;
    

  • 约束:

    我们无权在这些机器上安装 Wireshark 或任何其他网络监控工具。

    行为:
  • 使用 Fiddler 代理到 IIS Express 和 IIS 托管数据时
    服务:

    由于 SSL 名称不匹配,
  • Fiddler 将提示证书警告(我们尚未关闭此功能或为 localhost.fiddler 生成一个)。
  • Fiddler 将提示“请求使用 key 的许可”。我们认为这是基于存储在 Fiddler 目录中的证书 (.cer) 访问存储在 Current User\Personal 存储中的 .pfx 的请求,以便 Fiddler 使用正确的私钥签署请求。
  • 输入正确的密码后,请求成功。
  • 当使用 Fiddler 代理 Owin 或“Legacy”自托管数据服务时:

    由于 SSL 名称不匹配,
  • Fiddler 将提示证书警告(我们尚未关闭此功能或为 localhost.fiddler 生成一个)。
  • A 403.7 - 立即收到禁止。
  • 在没有 Fiddler 的情况下使用所有四种托管模型进行代理时:
  • 收到成功的响应。

  • 假设:
  • IIS 和 IISExpress 中的“SslRequireCert”设置与“ClientCertNegotiate”的自托管解决方案之间似乎存在行为差异。
  • 由于我们在不使用 Fiddler 的情况下正确接收证书(我们可以在调试器中正确拦截它),因此客户端证书协商在自托管解决方案中正常工作。
  • 使用 Fiddler 或不通过代理之间的行为差​​异似乎与我们目前看到的更低层有关。我们现在将此归因于 TCP 握手。

  • 问题:
  • SSL 证书名称不匹配对客户端证书禁止问题有任何影响吗?
  • 在自托管场景中,如何指定“SslNegotiateCert”和“SslRequireCert”的区别?
  • 在 OWIN 托管模型中是否有特定的方式来要求客户端证书?
  • 我们是否在配置数据服务时忽略了特定配置或设置,使其在 IIS 托管解决方案和自托管解决方案之间的行为方式相同?
  • 我们的错误是否可能在其他地方,例如在客户端或 Fiddler 证书配置中?
  • 最佳答案

    我只是忙于一个类似的问题,我想我偶尔会找到你第二个问题的答案。

    这完全取决于您使用 netsh 工具将服务器证书绑定(bind)到端口的方式。

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

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

    ,OWIN 主机开始要求客户端提供某种客户端证书(它可以是任何类型的证书)。

    当将该参数设置为 禁用 或只是省略它时,OWIN 主机不需要来自客户端的任何内容。

    关于authentication - 403.7 禁止在 Owin 自托管 Web API 2 中使用客户端证书身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20613658/

    相关文章:

    c# - 如何在 C# 中解析 json 列表

    javascript - Facebook 登录按钮回调函数

    asp.net-web-api - 使用 Swasbuckle 在 web api 的不同 Controller 中添加单独的自定义 header

    angularjs - 如何在使用 Angular.js 刷新后保持登录状态

    java - 从工作灯加载 Java 中的特定证书

    c# - 在 DMZ 中进行 WCF 用户名/密码身份验证的推荐方法是什么

    Django + uWSGI + Nginx + SSL - 工作配置请求(强调 SSL)

    json - 在 HttpConfiguration 实例中的 ASP.NET Web API 应用程序中处理 json pretty-print 参数

    Swift:反斜杠点 "\."是什么意思?

    node.js - Spotify API 授权代码流程返回 'unsupported_grant_type' 错误