Возможно ли отправить HttpWebRequest с использованием TLS1.2 на платформе .NET 4.0

Мое приложение подключается к серверу Experian, и Experian скоро перестанет поддерживать TLS 1.0 и TLS 1.1. Все соединения с использованием HTTPS должны использовать TLS версии 1.2.

Я хочу провести некоторое исследование по этой проблеме и увидеть, что отправка HttpWebRequest с использованием TLS 1.2 на платформе .NET 4.0 работает

Если этого не произойдет, мне, вероятно, потребуется создать webservice на .NET 4.5 и вызвать его методы, если это произойдет, мне ничего не нужно.

Кто-нибудь уже сталкивался с этой проблемой?

Ответ 1

Да, он поддерживает это, но вы должны явно установить версию TLS в ServicePointManager. Просто запустите этот код в любое время (в том же домене приложения), прежде чем звонить в Experian:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12

Обновить

см. @iignatov ответ, что вы должны сделать для framework v4.0. Мой код работает с 4. 5+

Ответ 2

Мне пришлось решить ту же проблему, интегрируя PayPal в устаревшее приложение и нашел следующее обходное решение для .NET 4.0, которое, похоже, делает трюк:

ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
ServicePointManager.DefaultConnectionLimit = 9999;

В основном обходной путь заключается в прямом назначении порта для TLS 1.2.

Все кредиты принадлежат комментатору на CodeProject.

Ответ 3

В переводе VB.NET игинатов отвечу:

ServicePointManager.Expect100Continue = True
ServicePointManager.SecurityProtocol = CType(3072, SecurityProtocolType)
ServicePointManager.DefaultConnectionLimit = 9999

Ответ 4

К сожалению нет, вы не можете этого сделать. Tls12 не был добавлен до .netfx 4.5 (см. документация). Обратите внимание, что это также требует корректной работы Windows Server 2008 R2 + или Windows 7+ (обратите внимание на раздел "Применяется к" на Представление TLS).

Ответ 5

FrameWork 4.0 не поддерживает TLS 1.1 или 1.2 Но вы можете решить эту проблему, загрузив Rebex.Http из диспетчера Nuget.

Rebex.Licensing.Key = "..."; //Lisans Number
var creator = new HttpRequestCreator();
creator.Register();

WebRequest request = WebRequest.Create("https://www.test.com");
request.Method = "POST";                
request.Headers.Add("utsToken", txtToken.Text);
request.ContentType = "application/json";
request.Method = "POST";

using (var streamWriter = new StreamWriter(request.GetRequestStream()))
{
    string json = "{\"VRG\":\"test\"}";

    streamWriter.Write(json);
    streamWriter.Flush();
    streamWriter.Close();
}

var httpResponse = (WebResponse)request.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
    var result = streamReader.ReadToEnd();
    txtSonuc.Text += result;
}

Ответ 6

Вы также можете использовать это:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | (SecurityProtocolType)768 | (SecurityProtocolType)3072;