无法使用自签名客户端证书对ASP.NET MVC3服务的调用进行身份验证

时间:2016-10-14 08:37:29

标签: c# asp.net-mvc-3 ssl iis certificate

我在IIS 7.5中使用.NET Framework 4.5运行ASP.NET MVC3服务,我希望使用客户端证书来保护对其中一个子路径的访问。对于该子路径,我制作了一个带有特制属性的控制器,该属性将访问请求客户端证书

public class CheckCertAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(
        ActionExecutingContext filterContext)
    {
        filterContext.HttpContext.Response.Headers.Add(
            "CheckCertAttribute", "entered");
        var cert = filterContext.HttpContext.Request.ClientCertificate;
        // check the cert here, optionally return HTTP 403
    }
}

最初调用OnActionExecuting()Certificate为空。结果我需要在web.config中启用SslNegotiateCert

<location path="PathOfInterest">
<system.webServer>
  <security>
    <access sslFlags="SslNegotiateCert"/>
  </security>
</system.webServer>
</location>

一旦我这样做,客户端总是收到HTTP 403,并且不再调用该属性。

客户端证书是自签名的并导出为.pfx(带有私钥)所以我猜问题是,一旦它到达服务器端,服务器就不喜欢它并且拒绝接受它通过。客户端使用HttpWebRequest

var cert = new X509Certificate2(pathToPfx, password);
var request = (HttpWebRequest)WebRequest.Create("https://my.company.com/PathOfInterest");
request.ClientCertificates.Add(cert);
request.GetResponse();

我之前已经使用过这种方法,但它确实有效。第一种情况是客户端证书不是自签名的,而是由中间证书签署,而中间证书又由一些受信任的根权限签署 - 在这种情况下,我的服务配置非常相似会收到它。第二种情况是使用自签名客户端证书来进行Azure管理服务调用,但在这种情况下我不知道服务器端是如何配置的。

因此,我得出的结论是,它是证书的自签名性质,使得它不能正常工作&#34;。我已经做了一些额外的事情 - 也许在web.config中添加一些内容或将证书添加到服务器端的某个证书库中。我不知道应该是什么。

如何使此设置有效?

1 个答案:

答案 0 :(得分:0)

IIS尝试&#34;协商&#34;与客户端的相互信任的连接,因为客户端证书是自签名的,所以它拒绝信任它。

您的选择:

  1. 使用由知名证书颁发机构颁发的证书。这可行,但您必须每年重新颁发证书。
  2. 运行您自己的CA基础架构,将其根CA证书添加到&#34;受信任的根&#34;服务机器的证书存储区和使用该根签署的颁发证书(可能通过中间证书)。
  3. 将自签名证书添加到&#34;受信任的根&#34;服务机器。 This may induce subtle yet serious security risks。我个人反对这个选择,因为它感觉真的不安全。
  4. 切换到其他一些不使用客户端证书的身份验证方案。