IIS 7.5和客户端身份验证

IIS 7.5和客户端身份验证

问题描述:

我必须做一个概念证明,到目前为止,我主要是找到引用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配置为允许客户端证书附加到一个请求,只是通过传递将是巨大的。

这是一个古老的问题,但我发现它,同时寻找我自己的答案,并认为它应该被回答。在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://*.com/questions/14407666/how-do-i-implement-client-certificate-authentication-the-right-way,也许提供我正在寻找的必要信息?对于我来说,与这个答案相关的重要性在于此配置的serverpart的web.config中此ClientCertificateMappingAuthentication节点的重要性。 – 2013-01-18 22:26:12

当服务器向浏览器询问客户端证书时,它会发送它所信任的证书颁发机构的列表。然后,浏览器根据此信息过滤可用证书,以便在证书选择对话框中仅显示相关证书(服务器信任的CA颁发的证书)。

(至少这是Internet Explorer中是如何工作的,我不知道其他的浏览器执行这种过滤。)

因此,客户端证书不应该自签名,但1)应该由证书颁发2)该证书颁发机构的证书应安装在服务器上(位于本地计算机帐户的受信任根证书颁发机构存储区中)。

出于测试目的,您可以设置自己的CA,只要确保其服务器上已安装证书即可。