Authentication IIS 7.5和客户端身份验证

Authentication IIS 7.5和客户端身份验证,authentication,client,certificate,iis-7.5,Authentication,Client,Certificate,Iis 7.5,我必须做一个概念证明,到目前为止,我发现主要是引用IIS6的旧文章,这是没有帮助的 总之,我有以下要求 我需要使用客户端证书保护一个文件/页和这一个文件/页。站点的其余部分确实需要在SSL下继续运行,但不需要客户端证书,只需要这一个文件。禁止用户映射,因为映射将通过C#/VB.NET以编程方式完成 现在我知道这并不难。我的意思是我应该有权访问Request.ClientCertificate属性,但我的问题是,在我的测试中,我无法获得一个客户端证书来进行传输 我已经在一个文件夹上设置了IIS(只

我必须做一个概念证明,到目前为止,我发现主要是引用IIS6的旧文章,这是没有帮助的

总之,我有以下要求

我需要使用客户端证书保护一个文件/页和这一个文件/页。站点的其余部分确实需要在SSL下继续运行,但不需要客户端证书,只需要这一个文件。禁止用户映射,因为映射将通过C#/VB.NET以编程方式完成

现在我知道这并不难。我的意思是我应该有权访问Request.ClientCertificate属性,但我的问题是,在我的测试中,我无法获得一个客户端证书来进行传输

我已经在一个文件夹上设置了IIS(只是为了简化我的生活),该文件夹要求SSL,接受客户端证书以及客户端证书,但访问该页面后,我从IIS获得的所有信息都是
HTTP/1.1403禁止
。我从未被要求选择要发送到服务器的客户端证书,它只是在我的请求中吐出并丢弃它

当我使用一些代码来测试它时,它变得更加奇怪。在此客户端代码中,CertPolicy类仅从忽略证书错误的方法返回true,test.cer是使用MakeCert生成的自签名证书。不过,我要说明的是,只有客户端证书(如果是自签名的),主证书才是正确签名的,但我经常玩fiddler,我不信任该证书,所以我有黑客回调

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
元素中添加一对一或多对一映射。

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

(至少InternetExplorer是这样工作的;我不知道是否有其他浏览器执行这种过滤。)

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


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

我发现,如果您指定
SslRequireCert
,则还必须指定
SslNegotiateCert
。看起来您已经掌握了一些信息。你能查一下,也许能提供我要找的必要信息吗?与此答案相关的重要信息是web.config中的ClientCertificateMappingAuthentication节点对于配置的服务器部分的重要性。