2010-08-24 207 views
4

我必須做一個概念證明,到目前爲止,我主要是找到引用IIS6的舊文章,這並沒有幫助。IIS 7.5和客戶端身份驗證

總之我有以下要求。

我需要使用客戶端證書來保護一個文件/頁面和這一個文件/頁面。網站的其他部分需要繼續在SSL下運行,但不需要客戶端證書,只需要這一個文件即可。用戶映射是被禁止的,因爲映射將通過C#/ VB.NET以編程方式完成。

現在我知道這應該不難。我的意思是我應該可以訪問Request.ClientCertificate屬性,但是我的問題是,在我的測試中,我無法獲得客戶端證書來沿着線路傳輸。

我設置IIS上的一個文件夾(只是爲了讓我的生活簡單)要求SSL並接受客戶端證書,以及需要客戶端證書但我從IIS得到一次訪問該頁面時 HTTP/1.1 403 Forbidden。我從來沒有被要求選擇一個客戶端證書發送到服務器,它只是將我的請求全部發送並丟棄它。

當我使用一些代碼來測試它時,它會變得更加怪異。在此客戶端代碼中,CertPolicy類只是從方法返回true以忽略證書錯誤,而test.cer是使用MakeCert製作的自簽名證書。只是要說清楚,只有客戶證書如果自簽名,主要證書是正確簽署的,但我與小提琴手很多玩,我沒有信任該證書,所以這就是爲什麼我有hacky回調。

Dim Cert As X509Certificate = X509Certificate.CreateFromCertFile("Cert\test.cer") 
' Handle any certificate errors on the certificate from the server. 
ServicePointManager.CertificatePolicy = New CertPolicy() 
' You must change the URL to point to your Web server. 
Dim Request As HttpWebRequest = DirectCast(WebRequest.Create("https://local.domain.com/Cert/Server/"), HttpWebRequest) 
Request.ClientCertificates.Add(Cert) 
Request.UserAgent = "Client Cert Sample" 
Request.Method = "GET" 

Dim sr As StreamReader 
Using Response As HttpWebResponse = DirectCast(Request.GetResponse, HttpWebResponse) 
    ' Print the repsonse headers. 
    output.AppendFormat("{0}\r\n", Response.Headers) 
    output.AppendLine() 
    ' Get the certificate data. 
    sr = New StreamReader(Response.GetResponseStream, Encoding.Default) 
    Dim count As Integer 
    Dim ReadBuf() As Char = New Char((1024) - 1) {} 
    Do 
     count = sr.Read(ReadBuf, 0, 1024) 
     If Not 0 = count Then 
      output.AppendLine(New String(ReadBuf)) 
     End If 
    Loop While (count > 0) 
End Using 

目標頁面剛剛返回附屬證書的數量,如果我設置IIS接受或忽略客戶端證書,但不要求它總是返回。

Protected Overrides Sub OnLoad(ByVal e As System.EventArgs) 
    MyBase.OnLoad(e) 
    Dim cs As HttpClientCertificate = Request.ClientCertificate 
    Response.Write(cs.Count) 
    Response.End() 
End Sub 

如果有人可以幫助我瞭解如何IIS7.5配置爲允許客戶端證書附加到一個請求,只是通過傳遞將是巨大的。

回答

3

這是一個古老的問題,但我發現它,同時尋找我自己的答案,並認爲它應該被回答。在web.config中的網站,使客戶端證書,則必須首先確保認證模塊被安裝,然後啓用該功能:

<location path="yourpath"> 
    <system.webServer> 
    <security> 
     <access sslFlags="Ssl, SslNegotiateCert"/> <!-- or SslRequireCert --> 
     <authentication> 
     <iisClientCertificateMappingAuthentication enabled="true" 
      oneToOneCertificateMappingsEnabled="true"> 
      <!-- or manyToOneCertificateMappingsEnabled="true" --> 
     </iisClientCertificateMappingAuthentication> 
     </authentication> 
    </security> 
    </system.webServer> 
</location> 

然後添加一個對一或多對一在iisClientCertificateMappingAuthentication元素的內部映射到一個映射。

+0

我發現如果你指定'SslRequireCert',你必須*也*指定'SslNegotiateCert'。 – AakashM 2012-11-07 08:58:42

+0

看起來像你正在做的事情。你可以檢查http://stackoverflow.com/questions/14407666/how-do-i-implement-client-certificate-authentication-the-right-way,也許提供我正在尋找的必要信息?對於我來說,與這個答案相關的重要性在於此配置的serverpart的web.config中此ClientCertificateMappingAuthentication節點的重要性。 – 2013-01-18 22:26:12

2

當服務器向瀏覽器詢問客戶端證書時,它會發送它所信任的證書頒發機構的列表。然後,瀏覽器根據此信息過濾可用證書,以便在證書選擇對話框中僅顯示相關證書(服務器信任的CA頒發的證書)。

(至少這是Internet Explorer中是如何工作的,我不知道其他的瀏覽器執行這種過濾。)

因此,客戶端證書不應該自簽名,但1)應該由證書頒發2)該證書頒發機構的證書應安裝在服務器上(位於本地計算機帳戶的受信任根證書頒發機構存儲區中)。

出於測試目的,您可以設置自己的CA,只要確保其服務器上已安裝證書即可。

相關問題