C# Обеспечение HttpWebRequest для использования Tls12 вместо SSLv3
У меня есть приложение, которое использует какой-то веб-сервис и получает данные через JSON, все работало нормально в течение достаточно долгого времени, вплоть до последних открытий о том, что SSLv3 уязвим для атак "человек посередине", и владельцы серверов навсегда отключили SSLv3., Мое приложение начало испытывать проблемы с подключением и вернуло ошибку "Запрос был прерван: не удалось установить безопасное соединение SSL/TLS". Я попытался найти решение и нашел информацию, которую я получил, чтобы добавить этот код перед созданием веб-запроса:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = delegate{
return true;
};
К сожалению, не повезло, приложение работает так же, как и раньше, и я понятия не имею, если этот код ничего не делает или все еще есть проблемы с сервером. Информация об ошибках довольно расплывчата, и я не могу понять, где что-то идет не так.
Вот мой код
...
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.ContentType = GetRequestContentType();
request.Method = method.ToString();
request.Credentials = GetCredential(url);
request.PreAuthenticate = true;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
...
Я хочу спросить, как установить Tls12, который будет использоваться по умолчанию, и убедиться, что в конце мой запрос соответствует желаемому протоколу.
Если я подтверждаю, что мое приложение нормально работает, есть ли способ получить более подробную информацию из ответа сервера и точно указать причину ошибки?
Спасибо за все ответы и предложения.
РЕДАКТИРОВАТЬ
Вторая часть вопроса решена, я нашел этот инструмент http://www.telerik.com/download/fiddler он в значительной степени позволяет увидеть, что происходит с исходящими и входящими данными. Кроме того, этот инструмент позволяет декодировать SSL-соединения, если включить эту опцию, мое приложение начнет работать. Я предполагаю, что это приложение делает что-то, что делает возможным обмен данными между моим приложением и хостом назначения. Но я до сих пор понятия не имею, что это может быть. И как заставить мое приложение правильно обрабатывать эти соединения.
1 ответ
Отчаяние заставило меня проверить весь исходный код (часть, ответственная за получение данных из Интернета, была третьей стороной, и до тех пор, пока она не заработала, не было причин менять ее), и я обнаружил эту строку
request.Credentials = GetCredential(url);
называется метод, который в своем теле имел
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;
Так что все мои попытки изменить это значение до создания httpwebrequest
был перезаписан Изменение SecurityProtocolType на Tls12 заставляет все это работать сейчас.