繁体   English   中英

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

[英]Cannot authenticate a call to ASP.NET MVC3 service with a self-signed client certificate

我有一个在.NET Framework 4.5的IIS 7.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为null。 原来我需要在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管理服务调用,但是在这种情况下,我不知道如何配置服务器端。

因此,我得出的结论是,它是证书的自签名性质,因此使其“无法正常工作”。 我需要做一些额外的事情-也许将一些内容添加到web.config或将证书添加到服务器端的某些证书​​存储中。 我只是不知道这应该是什么。

如何使该设置起作用?

IIS尝试与客户端“协商”相互信任的连接,并且由于客户端证书是自签名的,因此它拒绝信任它。

您的选择:

  1. 使用由知名证书颁发机构颁发的证书。 这会起作用,但是您每年必须大约重新颁发证书。
  2. 运行您自己的CA基础结构,将其根CA证书添加到服务机的“受信任的根”证书存储中,并颁发使用该根签名的证书(可能通过中间证书)。
  3. 将自签名证书添加到服务机的“受信任的根”中。 这可能会引发细微但严重的安全风险 我个人反对此选项,因为它确实很不安全。
  4. 切换到其他不使用客户端证书的身份验证方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM