IIS 7.5 и проверка подлинности клиента - PullRequest
4 голосов
/ 24 августа 2010

Мне нужно проверить концепцию, и до сих пор я нахожу в основном старые статьи, которые ссылаются на IIS6, что не помогает.

Короче говоря, у меня есть следующие требования.

Мне нужно защитить один файл / страницу и этот файл / страницу только с помощью сертификата клиента.Остальная часть сайта должна продолжать работать по протоколу 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, чтобы разрешить клиентские сертификаты присоединяться к запросу и просто проходить через него, что было бы здорово.

Ответы [ 2 ]

3 голосов
/ 30 декабря 2010

Это старый вопрос, но я нашел его, когда искал свои собственные ответы, и решил, что на него нужно ответить.В файле 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.

2 голосов
/ 07 февраля 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...