C # HttpWebRequest SEC_I_RENEGOTIATE Периодические ошибки - PullRequest
22 голосов
/ 04 июня 2011

Я работаю над функцией входа / выхода из системы, используя вызовы SSL POST в приложении C # (.Net Framework 3.5). Получение ответа от сервера через HttpWebRequest :: BeginGetResponse () работает 80% времени, но остальные 20% оно периодически выбрасывает:

The request was aborted: Could not create SSL/TLS secure channel.

Я включил трассировку SSL, используя предложенную статью из другого вопроса. Это привело к двум различным шаблонам в следах запроса.

Похоже, что во время выполнения выдается ошибка:

System.Net Error: 0 : [3680] Decrypt returned SEC_I_RENEGOTIATE.

принимается, что вызывает повторный запуск контекста безопасности. Когда это происходит, и это успешно, вот вывод (отметил, что я пропустил фактический адрес):

System.Net Error: 0 : [3680] Decrypt returned SEC_I_RENEGOTIATE.
System.Net Information: 0 : [3680] InitializeSecurityContext(credential =   System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [3680] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=78, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=1259, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=ContinueNeeded).
System.Net Information: 0 : [7148] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0a8a8, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [7148] InitializeSecurityContext(In-Buffers count=2, Out-Buffer length=0, returned code=OK).
System.Net Information: 0 : [7148] Remote certificate: [Version]
  V1

Когда это не удается:

System.Net Error: 0 : [3680] Decrypt returned SEC_I_RENEGOTIATE.
System.Net Information: 0 : [3680] InitializeSecurityContext(credential = System.Net.SafeFreeCredential_SECURITY, context = 4bec0d0:4c0ab50, targetName = [omitted].com, inFlags = ReplayDetect, SequenceDetect, Confidentiality, AllocateMemory, InitManualCredValidation)
System.Net Information: 0 : [3680] InitializeSecurityContext(In-Buffer length=0, Out-Buffer length=78, returned code=ContinueNeeded).
System.Net Error: 0 : [3680] Exception in the HttpWebRequest#20730349:: - The request was aborted: Could not create SSL/TLS secure channel.
System.Net Verbose: 0 : [3680] HttpWebRequest#20730349::EndGetResponse()
System.Net Error: 0 : [3680] Exception in the HttpWebRequest#20730349::EndGetResponse - The request was aborted: Could not create SSL/TLS secure channel.

Конечно, я могу поймать это исключение, но как правильно обращаться?

Есть ли способ для моего приложения предотвратить (или правильно обработать) эти ошибки? Когда это происходит, кажется, что какое-то время происходит постоянная ошибка, но затем снова начинает работать после некоторого неопределенного числа запросов.

Спасибо!

Ответы [ 3 ]

9 голосов
/ 05 июля 2011

(Оригинальный ответ см. Ниже.)

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

Если вы используете .NET 4.5 или более новую версию, попробуйте следующие варианты, от наиболее безопасного до наименее безопасного:

  • ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
  • ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11;
  • ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

Если вы используете .NET 4.0 или более раннюю версию, вы можете использовать только последнюю строку выше, так как эти версии не поддерживают TLSv1.1 и TLSv1.2. Настоятельно рекомендуется выполнить обновление до .NET 4.5, чтобы воспользоваться поддержкой TLSv1.2.

В дополнение к настройке свойства SecurityProtocol может потребоваться установить: ServicePointManager.Expect100Continue = true;

Если ни один из этих параметров не помогает, вероятно, это означает, что ваш сервер поддерживает только SSLv3 (или, что еще хуже, SSLv2). Если это так, обновите свой сервер! SSLv3 сломан и больше не должен использоваться.


SSLv3 НЕ ДОЛЖЕН считаться безопасным. НЕ ИСПОЛЬЗУЙТЕ эти настройки! Хотя это был правильный ответ в 2011 году, он остается здесь только по историческим причинам.

Вам необходимо добавить следующие строки кода перед вашим запросом:

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Из того, что я видел, более старые версии (.NET 2 и / или Windows XP / 2003 и старше) использовали их в качестве параметров по умолчанию, но более новые версии (.NET 3 и / или Windows Vista / 2008 и более новые) не делают .

4 голосов
/ 15 февраля 2012

Это не объяснение и не реальное решение: это просто самый прагматичный способ решения этой проблемы, который мы обнаружили в нашем случае (выполнение SOAP-запроса WCF через HTTPS с использованием клиентского SSL-сертификата с Apache & Java-сервер).

Перехватите исключение SecurityNegotiationException и повторите попытку на месте (т. Е. Вместо повторной обработки сообщения, если используется msmq) и подавите сообщение об исключении в этом случае. Просто включите счетчик производительности или что-то в этом роде, чтобы вы могли отслеживать, становится ли проблема хуже.

В конце концов, это только одна из тех врожденных проблем, связанных с сетью, с которыми ваш код должен иметь дело.

1 голос
/ 28 января 2017

Я подумал, что поделюсь своим опытом, поскольку в последнее время я читал большинство вопросов о стекопереработке по этому вопросу:

Другой подход к этому, который я видел, заключается в рассмотрении HTTP Keep-Alive.В последних версиях .Net по умолчанию используется HTTP 1.1, что означает, что для Keep-Alive задано значение true, а для Expect100 также включено.

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

Два варианта

1) Восстановите и попробуйте снова, что кажется немного вонючим.Однако, как упоминает Khanfx, проблемы с сетью могут возникать из-за этого: ошибки сетей.TOPAZ является одним из способов решения этой проблемы: https://msdn.microsoft.com/en-us/library/hh680901%28v=pandp.50%29.aspx?f=255&MSPPError=-2147217396

2) Отключите Keep-Alive либо с помощью HttpwebRequest, либо с помощью заголовка закрытия соединения при использовании HttpClient.

HTH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...