C#WebApi传入客户端证书始终为空

C#WebApi传入客户端证书始终为空,c#,asp.net,c#-4.0,ssl,asp.net-web-api,C#,Asp.net,C# 4.0,Ssl,Asp.net Web Api,我试图调试一个问题,即传入的请求从未附加客户端证书 我相当确定请求有一个客户端证书,我有测试代码,它运行于两个可能的端点(一个是我们的,一个是在第三方服务上),运行公共代码将证书附加到请求,SSL协商可以很好地运行于第三方服务 我在IISExpress(VS2010)和iis8上也有同样的问题 证书已在两台计算机上安装并受信任 我试过这里的步骤:没有运气 我尝试了这两种方法来访问证书,都是在自定义ActionFilter中 var cert = HttpContext.Current.Reque

我试图调试一个问题,即传入的请求从未附加客户端证书

我相当确定请求有一个客户端证书,我有测试代码,它运行于两个可能的端点(一个是我们的,一个是在第三方服务上),运行公共代码将证书附加到请求,SSL协商可以很好地运行于第三方服务

我在IISExpress(VS2010)和iis8上也有同样的问题

证书已在两台计算机上安装并受信任

我试过这里的步骤:没有运气

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

var cert = HttpContext.Current.Request.ClientCertificate;

var certificate = actionContext.Request.GetClientCertificate();

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

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


使用ActionFilter与DelegatingHandler应该没有关系,但我建议使用
DelegatingHandler
,因为它发生在创建控制器上下文之前,性能会更好(会更早地拒绝未经授权的请求)。

在何处获得证书应该没有关系。确保证书位于正确的位置,尤其是CA颁发者证书。应该位于本地计算机的受信任CA文件夹中。您可以使用OpenSSL对此进行故障排除,并查看证书是否导致问题

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


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

您是否尝试过将IIS配置为需要客户端证书?没有尝试过要求它,但这不会起作用,因为只有一个实际操作加上测试操作才能使用客户端证书。我在配置中尝试过这个,但没有成功。它在传出呼叫上使用了一个HttpWebRequest对象,并且证书肯定是附加的。在它执行实际POST请求之前,我可以将其视为请求对象的一部分。第三方服务也在接收证书并对其进行验证(我通过注释代码并看到SSL/TLS握手失败来确认这一点)。我之所以使用ActionFilter,是因为只有一个真实的(和一个测试)操作以这种方式进行身份验证。我完全同意,一般来说,如果处理程序总是需要验证,那么它会更理想。ActionFilter听起来很棒。听起来服务器配置有问题,如果其他服务器可以接收证书。您可以尝试在web服务器配置中使用
要求客户端证书。此外,我会尝试将私钥添加到您的客户端证书中,并使用该私钥对请求进行签名。证书是否可能存在信任或权限问题?我认为没有,因为它被附加到请求中,但可能值得追求。我没有进行广泛的(或目前的任何)验证,只是检查是否存在任何证书。证书位于根受信任文件夹以及个人存储中。我使用了具有固有信任问题的自签名客户端证书,并使用
Request.GetClientCertificate()
在服务器端查看它们。在本例中,我还使用以下代码关闭了X509CertificateValidator:
HttpSelfHostConfiguration config=new-HttpSelfHostConfiguration(“localhost”);//告诉系统服务器需要客户端证书config.ClientCredentialType=HttpClientCredentialType.Certificate;//关闭内置证书验证配置X509CertificateValidator=X509CertificateValidator.None我不知道你是如何托管服务器的