У нас есть веб-приложение .Net 2.0, которое использует стороннюю сборку для вызова веб-службы с нашей веб-страницы, работающей на сервере, на сторонний сайт. Звонок осуществляется по https. Этот код работал без проблем в течение многих лет, пока не прошло около 2 недель. Поставщик действительно обновил свои сертификаты в течение последнего месяца. Однако ни один другой клиент не сообщил о проблеме, и некоторые из наших собственных машин работают без проблем. На некоторых наших серверах при совершении вызова мы получаем: Запрос был прерван: не удалось создать безопасный канал SSL/TLS. На других серверах проблем нет. На всех серверах установлена ​​операционная система Windows 2003 с одним и тем же кодом. Мы включили трассировку .Net и зафиксировали трассировку на хорошем сервере и двух плохих. Мы проверили, что сертификат, возвращаемый на все серверы, одинаков. Трассировка .Net показывает, что один из вызовов InitializeSecurityContext возвращается с возвращенным кодом = недопустимое сообщение. Я проверил, что версии schannel.dll, secur32.dll и system.net.dll одинаковы на всех серверах. Я также проверил, что ЦС является доверенным (его Verisign).

На данный момент я ищу любые идеи по устранению неполадок.

Выдержки из журнала ниже. Первый — с сервера, который получает ошибку. Обратите внимание, что в журналах для плохих серверов последовательность получения байтов всегда 204, 5, 2, ошибка. На хорошем сервере последовательность байтов всегда 204, 5, 1, требуется продолжение.

Плохой сервер

System.Net.Sockets Verbose: 0: [15784] Выход из сокета # 50912888 :: Send () -> 204 # 204

System.Net.Sockets Verbose: 0: [15784] Socket#50912888::Receive()

System.Net.Sockets Verbose: 0: [15784] Данные из сокета № 50912888 :: Получить

System.Net.Sockets Verbose: 0: [15784] 00000000: 15 03 00 00 02: .....

System.Net.Sockets Verbose: 0: [15784] Exiting Socket#50912888::Receive() -> 5#5

System.Net.Sockets Verbose: 0: [15784] Socket#50912888::Receive()

System.Net.Sockets Verbose: 0: [15784] Данные из сокета № 50912888 :: Получить

System.Net.Sockets Verbose: 0: [15784] 00000005: 02 28: .(

System.Net.Sockets Verbose: 0: [15784] Выход из сокета # 50912888 :: Receive () -> 2 # 2

Информация System.Net: 0: [15784] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 10709bc8:189fc88, targetName = transform.documentmailbox.net, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)

Информация System.Net: 0: [15784] InitializeSecurityContext (количество входных буферов = 2, длина исходящего буфера = 0, возвращенный код = IllegalMessage).

System.Net.Sockets Verbose: 0: [15784] Socket#50912888::Dispose()

Ошибка System.Net: 0: [15784] Исключение в HttpWebRequest#44205226:: — Запрос был прерван: не удалось создать безопасный канал SSL/TLS.

Ошибка System.Net: 0: [15784] Исключение в HttpWebRequest#44205226::EndGetRequestStream — запрос был прерван: не удалось создать безопасный канал SSL/TLS.

Хороший сервер:

System.Net.Sockets Verbose: 0: [0244] Выход из Socket#56654665::Send() -> 204#204

System.Net.Sockets Verbose: 0: [0244] Socket#56654665::Receive()

System.Net.Sockets Verbose: 0: [0244] Данные из Socket#56654665::Receive

System.Net.Sockets Verbose: 0: [0244] 00000000: 14 03 00 00 01: .....

System.Net.Sockets Verbose: 0: [0244] Выход из Socket#56654665::Receive() -> 5#5

System.Net.Sockets Verbose: 0: [0244] Socket#56654665::Receive()

System.Net.Sockets Verbose: 0: [0244] Данные из Socket#56654665::Receive

System.Net.Sockets Verbose: 0: [0244] 00000005: 01: .

System.Net.Sockets Verbose: 0: [0244] Выход из Socket#56654665::Receive() -> 1#1

Информация System.Net: 0: [0244] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = b2310:174420, targetName = transform.documentmailbox.net, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)

Информация System.Net: 0: [0244] InitializeSecurityContext (количество входных буферов = 2, длина исходящего буфера = 0, возвращенный код = ContinueNeeded).

System.Net.Sockets Verbose: 0: [0244] Socket#56654665::Receive()

System.Net.Sockets Verbose: 0: [0244] Данные из Socket#56654665::Receive

System.Net.Sockets Verbose: 0: [0244] 00000000: 16 03 00 00 38: ....8

System.Net.Sockets Verbose: 0: [0244] Выход из Socket#56654665::Receive() -> 5#5

System.Net.Sockets Verbose: 0: [0244] Socket#56654665::Receive()

System.Net.Sockets Verbose: 0: [0244] Данные из Socket#56654665::Receive

System.Net.Sockets Verbose: 0 : [0244] 00000005 : C0 44 EB FF 6A 88 AD DA-2C 5A 74 99 AD 11 CE 16 : .D..j...,Zt.....

System.Net.Sockets Verbose: 0 : [0244] 00000015 : 4B 10 29 D7 DD 4E A0 83-E9 DE EB BD 37 2F 81 FB : K.)..N......7/..

System.Net.Sockets Verbose: 0 : [0244] 00000025 : D4 9C 99 6C FB A0 CA 6B-1A 4E 7A CA B9 39 1B 91 : ...l...k.Nz..9..

System.Net.Sockets Verbose: 0: [0244] 00000035: 7B 26 B1 01 8C FD C1 08-: {&......

System.Net.Sockets Verbose: 0: [0244] Выход из Socket#56654665::Receive() -> 56#56

Информация System.Net: 0: [0244] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = b2310:174420, targetName = transform.documentmailbox.net, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)

Информация System.Net: 0: [0244] InitializeSecurityContext (количество входных буферов = 2, длина исходящего буфера = 0, возвращенный код = OK).

3
Tim 18 Мар 2011 в 17:57

1 ответ

Поскольку вы просили дать советы по устранению неполадок, а не окончательный ответ, я опубликую это как ответ, но примите это за то, что оно того стоит...

Основываясь на том факте, что некоторые серверы могут получить к нему доступ, а другие — нет, могу поспорить, что проблема по-прежнему связана с доверием к сертификату.

Сертификат мог быть выпущен Verisign и вполне может быть доверенным на большинстве компьютеров, но это НЕ означает, что ему доверяют на всех компьютерах.

У нас были похожие проблемы около 6 месяцев назад, когда мы обновили сертификаты на нашем основном веб-сервере. Мы приняли несколько звонков от клиентов, и в каждом случае решение заключалось в том, чтобы попросить их перейти в Центр обновлений Windows и найти обновление корневых сертификатов ИЛИ найти самое последнее обновление в Google и загрузить его из Microsoft. По-видимому, по какой-то причине обновления корневого сертификата не всегда применяются в обычном процессе обновления.

0
David 18 Мар 2011 в 18:10
Знаете ли вы, есть ли способ узнать, есть ли на сервере Windows 2003 последние корневые сертификаты? Служба, которая должна поддерживать их в актуальном состоянии, установлена. На сайте Центра обновления Windows есть только пакеты обновлений сертификатов для XP. Спасибо за предложение.
 – 
Tim
18 Мар 2011 в 21:27
Я не знаю точно, как сказать. Это может быть вопрос к ребятам из Serverfault.com, НО я знаю, что вы можете найти последние обновления корневого сертификата, выполнив поиск на сайте загрузки Microsoft microsoft.com/downloads/en/…
 – 
David
19 Мар 2011 в 01:40