【问题标题】:C# WebApi incoming client certificate always nullC# WebApi 传入客户端证书始终为空
【发布时间】:2014-05-28 16:04:07
【问题描述】:

我正在尝试调试从未附加客户端证书的传入请求的问题。

我相当确定请求有一个客户端证书,我有针对两个可能的端点(一个是我们的,一个在第三方服务上)运行的测试代码,运行通用代码以将证书附加到请求和SSL 协商适用于第三方服务。

我在 IISExpress (VS2010) 以及 IIS 8 上遇到了同样的问题。

证书在两台机器上都安装并受信任。

我已经尝试过这里的步骤:http://www.asp.net/web-api/overview/security/working-with-ssl-in-web-api,但没有成功。

我已经尝试了这两种方法来访问证书,都在自定义 ActionFilter 中

var cert = HttpContext.Current.Request.ClientCertificate;

var certificate = actionContext.Request.GetClientCertificate();

是否可能是 ActionFilter 与 DelegatingHandler 的上下文导致了问题?

【问题讨论】:

  • 您是否尝试过将 IIS 配置为需要客户端证书?
  • 没有尝试要求它,但这不会起作用,因为只有一个实际操作加上测试一个与客户端证书一起使用。我已经在配置中尝试过这个,但没有运气。

标签: c# asp.net c#-4.0 ssl asp.net-web-api


【解决方案1】:

从哪里获得证书并不重要。确保证书位于正确的位置,尤其是 CA 颁发者证书。这应该在您的本地计算机的 Trusted CA 文件夹中。您可以使用 OpenSSL 解决此问题,并查看证书是否导致问题。

一个很常见的问题是在握手过程中,服务器会发送一个受信任的 CA 列表,但是有一个限制,因此如果您有很多受信任的 CA,其中一些会被截断。因此,客户端永远不会发送证书。您可以尝试清理 Trusted Authorities 文件夹,但请确保不要删除任何重要的强制 CA。另一种方法是在您的注册表编辑器中添加一个条目,以不允许服务器发送受信任的 CA 列表。 You can read more here.

另外,如果您使用的是 IIS,则不需要使用 selfhost。

【讨论】:

    【解决方案2】:

    您的客户端代码是什么样的?您是否将客户端证书附加到您的WebRequestHandler

    使用 ActionFilter 还是 DelegatingHanlder 无关紧要,但我建议使用 DelegatingHandler,因为它发生在控制器上下文创建之前并且性能更高(将更早拒绝未经授权的请求)。

    【讨论】:

    • 它在呼出电话上使用了一个 HttpWebRequest 对象,并且证书肯定是附加的。在它执行实际的 POST 请求之前,我可以将其视为请求对象的一部分。第三方服务也在接收证书并对其进行验证(我已经通过注释掉代码并看到 SSL/TLS 握手失败来确认这一点)。我正在使用 ActionFilter,因为它只是以这种方式进行身份验证的一个真实(和一个测试)操作。我绝对同意总的来说,如果它总是需要验证,那么 Handler 会更理想。
    • ActionFilter 听起来很棒。听起来服务器配置有问题,那么如果另一台服务器可以接收证书。您可以尝试在您的 Web 服务器配置中要求使用 <access sslFlags="Ssl, SslRequireCert" /> 的客户端证书。另外我会尝试将私钥添加到您的客户端证书并用它签署请求。
    • 证书是否可能存在信任或权限问题?我认为不,因为它附加到请求中,但可能值得追求。我没有进行广泛的(或目前任何)验证,只是检查是否存在任何证书。证书位于受信任的根文件夹以及个人存储中。
    • 我使用了具有固有信任问题的自签名客户端证书,并使用Request.GetClientCertificate() 在服务器端查看它们。在这种情况下,我还使用以下代码关闭了 X509CertificateValidator:HttpSelfHostConfiguration config = new HttpSelfHostConfiguration("localhost"); // tell the system that the server requires client cert config.ClientCredentialType = HttpClientCredentialType.Certificate; // turn off the built in certificate authentication config.X509CertificateValidator = X509CertificateValidator.None;我不知道您如何托管服务器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-07
    • 2015-08-07
    • 1970-01-01
    • 2015-10-01
    • 2019-10-25
    • 2013-10-01
    • 1970-01-01
    相关资源
    最近更新 更多