Я разрабатываю веб-приложение ASP.NET, которое отправляет запрос на другой сервер с помощью HttpWebRequest. Он отправляет запрос по HTTPS, а удаленному серверу требуется сертификат клиента. Запрос не выполняется в приложении .NET, по-видимому, не удается отправить правильный сертификат клиента. Я могууспешно подключиться и отправить клиентский сертификат, если просто зайду по URL-адресу в веб-браузере (в частности, в Chrome).
Приведенный ниже код представляет собой простое воспроизведение с простым запросом GET.
var r = WebRequest.Create(url) as HttpWebRequest;
r.ClientCertificates = new X509CertificateCollection { myX509Cert };
using (var resp = r.GetResponse() as HttpWebResponse) {
...
}
Я получаю наше любимое исключение: «Не удалось создать защищенный канал SSL/TLS». Как правило, эти типы проблем указывают на проблемы с разрешениями на закрытый ключ вашего сертификата. Я перепробовал все, что мог придумать, чтобы убедиться, что все настроено правильно, но, возможно, я что-то упустил. Короче говоря, удаленный сервер отправляет TLS CertificateRequest
со списком, который, кажется, правильно идентифицирует мой клиентский сертификат, но мое приложение не отвечает ни одним клиентским сертификатом.
Вот мои настройки:
Вот все, что я пробовал и что мне известно:
HasPrivateKey
= truePreAuthenticate = true
в объекте запроса. Не имеет значенияServicePointManager.Expect100Continue = false
, не имеет значенияServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
, но, видимо, удаленному серверу требуется TLS, так что это не помогает.ServicePointManager.ServerCertificateValidationCallback
так, чтобы он всегда возвращал true. Но запрос терпит неудачу ранее в рукопожатии TLS, прежде чем он даже дойдет до точки вызова этого делегата. Я добавил трассировку System.Net и увидел это:
SecureChannel # 26717201 - у нас есть предоставленные пользователем сертификаты. . Сервер указал 6 эмитентов. Ищем сертификаты, которые соответствуют любому из эмитентов.
SecureChannel#26717201 — осталось 0 клиентских сертификатов на выбор.
...
InitializeSecurityContext (количество входных буферов = 2, длина исходящего буфера = 0, возвращенный код = CertUnknown).
Я включил полное ведение журнала SCHANNELи увидел это предупреждение:
Удаленный сервер запросил аутентификацию клиента SSL, но не удалось найти подходящий сертификат клиента. Будет предпринята попытка анонимного подключения. Этот запрос на соединение SSL может быть успешным или неудачным, в зависимости от настроек политики сервера.
Я запустил Wireshark и увидел, что удаленный сервер отправил CertificateRequest
, и, похоже, у него есть запись Distinguished Name
с указанными значениями CN\OU\O моего клиентского сертификата. точно. После этого мое приложение отправляет ответ сертификата без сертификатов.
Похоже, я что-то упустил при настройке этого сертификата для правильной работы с приложениями .NET в Windows 7.Мое лучшее предположение состоит в том, что на моем новом компьютере с Windows 7 есть что-то другое, по сравнению с компьютером с XP, что приводит к сбою сейчас. В настоящий момент у меня нет доступа к среде Windows XP, чтобы подтвердить это;Я буду через пару дней, но действительно хотел бы решить эту проблему как можно скорее.
Будем признательны за любые идеи. Спасибо!
РЕДАКТИРОВАТЬКак описано выше, при подключении к URL-адресу в Chrome браузер запрашивает у меня сертификат клиента, и я могу предоставить правильный сертификат и успешно подключиться. Однако я не могу сделать это успешно в Internet Explorer (9). Я просто получаю «Internet Explorer не может отобразить веб-страницу» без каких-либо других подсказок или объяснений. Мне сказали, что это может иметь значение, поскольку WebRequest.Create
ведет себя аналогично IE. Я изучаю, что это может означать, но ценю любые мысли по этому поводу.
РЕДАКТИРОВАТЬКроме того, я должен отметить, что удаленный сервер использует самозаверяющий сертификат SSL. Первоначально я думал, что это может быть проблемой, поэтому я добавил сертификат в качестве доверенного корня в MMC, чтобы сертификат отображался как действительный на моей машине. Это не решило проблему.