HttpWebRequest HTTPS и сертификат
От: programmer_st  
Дата: 28.11.07 22:17
Оценка:
..............
Imports System.Net
Imports System.IO
Imports System.Net.Security
Imports System.Security.Cryptography.X509Certificates
Dim StrRequest As String
Dim Request As HttpWebRequest
Request = HttpWebRequest.Create("https://...")
Request.Method = "POST"
Request.ContentType = "text/xml"
Request.Accept = "application/x-www-form-urlencoded"
Dim cert As X509Certificate = X509Certificate.CreateFromCertFile("C:\cert.cer")

Request.ClientCertificates.Add(cert)

Dim POSTData As Byte() = System.Text.Encoding.UTF8.GetBytes(StrRequest.ToCharArray())
Request.ContentLength = POSTData.Length

ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateCertificate)

Request.GetRequestStream().Write(POSTData, 0, POSTData.Length)

Request.GetRequestStream().Close()
.......................................

проблема в том что после write вываливается сообщение The underlying connection was closed: An unexpected error occurred on a send. На сервере сертификат нормальный т.е. срок действия не истек. Не могу понять какие еще могут быть проблемы .. сертификат который пытаюсь добавить из файла тоже есть в хранилище в разделе доверенных серверов. Может какие еще проблемы бывают .. кто.нибудь сталкивался? в IE этот запрос без проблем отрабатывает ..
Re: HttpWebRequest HTTPS и сертификат
От: stump http://stump-workshop.blogspot.com/
Дата: 29.11.07 10:08
Оценка:
Здравствуйте, programmer_st, Вы писали:

_>проблема в том что после write вываливается сообщение The underlying connection was closed: An unexpected error occurred on a send. На сервере сертификат нормальный т.е. срок действия не истек. Не могу понять какие еще могут быть проблемы .. сертификат который пытаюсь добавить из файла тоже есть в хранилище в разделе доверенных серверов. Может какие еще проблемы бывают .. кто.нибудь сталкивался? в IE этот запрос без проблем отрабатывает ..


Проблемы с сертификатом.
У тебя ValidateCertificate что возвращает? Поставь там точку прерывания, при каждой проблеме (например, имя сервера в URL запроса не совпадает с именем сервера в сертификате) будет вызываться твой ValidateCertificate. Если он хоть раз вернет false то ты получишь "The underlying connection was closed: An unexpected error occurred on a send."
К стати, в C:\cert.cer хранится сертификат сервера или клиента? Если там сертификат сервера то делать
Dim cert As X509Certificate = X509Certificate.CreateFromCertFile("C:\cert.cer")
Request.ClientCertificates.Add(cert)

не надо. Лучше инсталлируй этот сертификат в локальное хранилище.
Понедельник начинается в субботу
Re[2]: HttpWebRequest HTTPS и сертификат
От: Аноним  
Дата: 29.11.07 11:50
Оценка:
Здравствуйте, stump, Вы писали:
S>Проблемы с сертификатом.
S>У тебя ValidateCertificate что возвращает? Поставь там точку прерывания, при каждой проблеме (например, имя сервера в URL запроса не совпадает с именем сервера в сертификате) будет вызываться твой ValidateCertificate. Если он хоть раз вернет false то ты получишь "The underlying connection was closed: An unexpected error occurred on a send."
S>К стати, в C:\cert.cer хранится сертификат сервера или клиента? Если там сертификат сервера то делать
S>
S>Dim cert As X509Certificate = X509Certificate.CreateFromCertFile("C:\cert.cer")
S>Request.ClientCertificates.Add(cert)
S>

S>не надо. Лучше инсталлируй этот сертификат в локальное хранилище.

Функция такая .. по идее должна все сертификаты пропускать .. или это не верно? ..
Private Function ValidateCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
Return True
End Function

А сертификат серверный .. другого нет .. если его не прикреплять то какой сертификат для HttpWebRequest.ClientCertificates использовать? .. там пусто по умолчанию .. и не заполняется вроде ..
Серверный сертификат уже куда только не поставил .. он есть и в доверенных сайтах и в других пользователях .. а как персональный он не инсталлируется ..
Re[3]: HttpWebRequest HTTPS и сертификат
От: stump http://stump-workshop.blogspot.com/
Дата: 29.11.07 12:02
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Функция такая .. по идее должна все сертификаты пропускать .. или это не верно? ..
А>Private Function ValidateCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
А> Return True
А>End Function
Верно.

А>А сертификат серверный .. другого нет .. если его не прикреплять то какой сертификат для HttpWebRequest.ClientCertificates использовать? .. там пусто по умолчанию .. и не заполняется вроде ..

Серверный сертификат никуда цеплять не надо. Он с сервера придет сам и ты его можешь найти в HttpWebRequest.ServicePoint.Certificate.
Клиентский сертификат нужен только в случае, когда на сервере используется режим аутентификации по клиентским сертификатам. Для всех остальных случаев надо заполнять HttpWebRequest.Credentials.

Да, и еще
ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf ValidateCertificate)

должен идти до того как ты создаешь экземпляр HttpWebRequest
Понедельник начинается в субботу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.