Мне нужно обновить приложение .NET для поддержки вызова API на веб-сайте, который поддерживает только TLS 1.2. Из того, что я прочитал, если приложение нацелено на 4.6 или выше, оно будет использовать TLS 1.2 по умолчанию.
Для тестирования я создал приложение Windows Forms, цель которого 4.7. К сожалению, это ошибки, когда я не устанавливаю явно ServicePointManager.SecurityProtocol. Вот код:
HttpClient _client = new HttpClient();
var msg = new StringBuilder();
// If I uncomment the next line it works, but fails even with 4.7
// ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var httpWebRequest = (HttpWebRequest)WebRequest.Create("https://sandbox.authorize.net");
httpWebRequest.KeepAlive = false;
try
{
var httpWebResponse = (HttpWebResponse) httpWebRequest.GetResponse();
msg.AppendLine("The HTTP request Headers for the first request are: ");
foreach (var header in httpWebRequest.Headers)
{
msg.AppendLine(header.ToString());
}
ResponseTextBox.Text = msg.ToString();
}
catch (Exception exception)
{
ResponseTextBox.Text = exception.Message;
if (exception.InnerException != null)
{
ResponseTextBox.Text += Environment.NewLine + @" ->" + exception.InnerException.Message;
if (exception.InnerException.InnerException != null)
{
ResponseTextBox.Text += Environment.NewLine + @" ->" + exception.InnerException.InnerException.Message;
}
}
}
Если вы раскомментируете следующую строку:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
он работает. Это нехорошее решение, поскольку он жестко кодирует версию TLS, поэтому в будущем он не будет использовать TLS 1.3.
Что еще мне нужно сделать, чтобы заставить его работать без этой строки. Я тестирую машину Window 10 с установленным 4.7.
Обновление
Я попробовал тест с HttpClient и имел те же результаты, я должен был явно установить SecurityProtocol.
Код:
var msg = new StringBuilder();
// Need to uncomment code below for TLS 1.2 to be used
// ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
try
{
var response = await _client.GetAsync(@"https://sandbox.authorize.net");
msg.AppendLine("response.IsSuccessStatusCode : " + response.IsSuccessStatusCode);
msg.AppendLine(await response.Content.ReadAsStringAsync());
textBox.Text = msg.ToString();
}
catch (Exception exception)
{
textBox.Text = exception.Message;
if (exception.InnerException != null)
{
textBox.Text += Environment.NewLine + @" ->" + exception.InnerException.Message;
}
}