Двусторонняя аутентификация с использованием ssl в dotnet - PullRequest
7 голосов
/ 15 декабря 2010

У меня есть проект, в котором мне нужно отправить файл данных через веб-запрос. Нам нужно настроить двустороннюю аутентификацию, также известную как взаимная аутентификация. Мы не уверены, нужен ли нам специальный сертификат или нет, но мы знаем, что это должен быть уровень 3.

У меня проблемы с поиском примера кода для этого случая. Я не знаю, куда добавить нашу справочную информацию. С этим кодом выдается ошибка Underlying connection is closed, когда мы пытаемся прочитать поток ответа, а ServicePointManager.ServerCertificateValidationCallback никогда не вызывается. Вот что у меня есть:

ServicePointManager.ServerCertificateValidationCallback = New Security.RemoteCertificateValidationCallback(AddressOf MyCertValidationCb)
            httpReq = CType(System.Net.HttpWebRequest.Create(url), HttpWebRequest)
            For Each cert As String In certs
                X509cert = X509Certificate2.CreateFromCertFile(cert)
                X509cert2 = New X509Certificate2(X509cert)
                httpReq.ClientCertificates.Add(X509cert2)
            Next
            httpReq.Method = "POST"        ' Post method
            httpReq.ContentType = "text/xml"               ' content type

            ' Wrap the request stream with a text-based writer
            writer = New StreamWriter(httpReq.GetRequestStream())
            ' Write the XML text into the stream
            reader = New StreamReader(filename.Name)
            ret = reader.ReadToEnd()
            reader.Close()
            ' Send the data to the webserver
            writer.WriteLine(ret)
            writer.Close()
            ' Wait for response
            Dim httpRsp As System.Net.HttpWebResponse = CType(httpReq.GetResponse(), HttpWebResponse)
            sr = New StreamReader(httpRsp.GetResponseStream)
            responseText = sr.ReadToEnd

            If httpReq IsNot Nothing Then
                httpReq.GetRequestStream().Close()
            End If
            If httpRsp IsNot Nothing Then
                httpRsp.GetResponseStream().Close()
            End If

Любые советы или ссылки на блоги с образцом кода будут великолепны. Спасибо.

1 Ответ

1 голос
/ 14 декабря 2012

Вам не нужен «специальный» сертификат.Вашему клиенту нужен собственный сертификат и используйте его в соединении, чтобы сообщить серверу его личность.Это называется сертификат клиента.Сервер должен обрабатывать это правильно.

В следующей статье MSDN рассказывается о том, как установить ваш ClientCertificate: http://msdn.microsoft.com/en-us/library/ms732391.aspx?cs-save-lang=1&cs-lang=vb#code-snippet-2

...