我必须做一个概念验证,到目前为止,我发现主要是引用IIS6的旧文章,这些文章没有帮助。
简而言之,我有以下要求。
我需要使用客户端证书来保护一个文件/页面和一个文件/页面。该网站的其余部分确实需要继续在SSL下运行,但不需要客户端证书,只需要这个文件。禁止用户映射,因为映射将通过C#/ VB.NET以编程方式完成。
现在我知道这应该不难。我的意思是我应该可以访问Request.ClientCertificate属性,但我的问题是,在我的测试中,我无法获得客户端证书以便沿着网络旅行。
我在一个文件夹上设置IIS(只是为了让我的生活变得简单)需要SSL并接受客户端证书以及需要客户端证书,但是一旦访问该页面,我从iis获得的是
HTTP/1.1 403 Forbidden
。我永远不会被要求选择一个客户端证书发送到服务器,它只是在我的请求中喷出并丢弃它。
当我使用一些代码来测试时,它变得更加怪异。在此客户端代码中,CertPolicy类仅从忽略证书错误的方法返回true,而test.cer是使用MakeCert生成的自签名证书。只是为了说清楚,只有客户端证书,如果自签名,主证书已正确签名,但我玩fiddler很多,我不信任该证书,这就是为什么我有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以允许客户端证书附加到请求并且刚刚通过那将是很好的。
答案 0 :(得分: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
元素内添加一对一或多对一映射。
答案 1 :(得分:2)
当服务器向浏览器询问客户端证书时,它会发送一个它信任的证书颁发机构列表。然后,浏览器根据此信息过滤可用的证书,以便在证书选择对话框中仅显示相关证书(服务器信任的CA颁发的证书)。
(至少这是Internet Explorer的工作方式;我不知道其他浏览器是否会执行此类过滤。)
因此,客户端证书不应该是自签名的,但1)应由证书颁发机构颁发,2)该证书颁发机构的证书应安装在服务器上(在本地计算机的受信任的根证书颁发机构存储中)帐户)。
出于测试目的,您可以设置自己的CA,只需确保其证书已安装在服务器上。