2010-08-24 13 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. Просто чтобы было ясно, хотя, только клиентский сертификат, если он подписан сам, главный сертификат правильно подписан, но я играю с скрипачом, и я не доверяю этому сертификату, поэтому у меня есть хакерский обратный вызов.

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> 

Затем добавить один-к-одному или многочастичных to-one внутри элемента iisClientCertificateMappingAuthentication.

+0

Я нахожу, что если вы укажете 'SslRequireCert', вы также должны * указать * SslNegotiateCert'. – AakashM

+0

похоже, что вы на что-то. Не могли бы вы проверить http://stackoverflow.com/questions/14407666/how-do-implement-client-certificate-authentication-the-right-way и, возможно, предоставить необходимую информацию, которую я ищу? Важным для меня, связанным с этим ответом, является важность этого узла ClientCertificateMappingAuthentication в файле web.config для серверной части конфигурации. –

2

Когда сервер запрашивает браузер для сертификата клиента, он отправляет список доверенных им сертификатов. Затем браузер фильтрует доступные сертификаты на основе этой информации, чтобы отображать в диалоговом окне выбора сертификатов только соответствующие сертификаты (те, которые выдаются CAs доверяет серверам).

(По крайней мере, это то, как работает Internet Explorer, я не знаю, если другие браузеры выполняют такую ​​фильтрацию.)

Поэтому клиент сертификат не должен быть самозаверенный, но 1) должен быть выдан сертификат 2) сертификат этого центра сертификации должен быть установлен на сервере (в хранилище доверенных корневых сертификатов учетной записи локального компьютера).

Для тестирования вы можете настроить свой собственный ЦС, просто убедитесь, что его сертификат установлен на сервере.