7

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

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

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

+2

У вас есть особое требование, не позволяет использовать WS-Security на SOAP? Между .NET и IIS, то есть WCF, это будет обрабатывать SSL-отказ и отказ от использования совместно используемого сертификата. Переключение на TLS и/или шифрование сообщений - это вопрос установки флажков. Нет необходимости в классе 3, тогда будет работать только класс 1 PKCS12 с закрытым ключом, без необходимости доверенного корня сети. – ssamuel

ответ

1

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

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