簡體   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