Я создаю ASP. NET Core 3.0 веб-приложение, которое развертывается с использованием Octopus. Это все работает просто отлично. Мы скоро начнем работать, поэтому я укрепил серверы, удалив небезопасные протоколы и т. Д. c. используя IISCrypto. Остался только один Tls 1.2.
Теперь я не могу выполнить HttpWebRequest для своего развернутого веб-приложения из инструмента командной строки. NET, который я написал для ввода приложения в эксплуатацию. Я получаю эту ошибку в журналах:
Система. Net .WebException: Не удалось установить соединение SSL, см. Внутреннее исключение. Невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом. ---> Система. Net .Http.HttpRequestException: Невозможно установить соединение SSL, см. Внутреннее исключение. ---> System.IO.IOException: невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом. ---> System. Net .Sockets.SocketException (10054): существующее соединение было принудительно закрыто удаленным хостом.
Поэтому я попытался использовать некоторые из советов, найденных на SO:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Но это ничего не меняет. Как будто эта строка игнорируется.
Код, который не работает:
HttpWebRequest http = (HttpWebRequest)WebRequest.Create(new Uri(url));
http.Accept = "application/json";
http.ContentType = "application/json";
http.Method = method;
if (String.IsNullOrWhiteSpace(token) == false) {
http.Headers.Add("Authorization", $"Bearer {token}");
}
if (String.IsNullOrWhiteSpace(data) == false) {
UTF8Encoding encoding = new UTF8Encoding();
Byte[] bytes = encoding.GetBytes(data);
Stream newStream = http.GetRequestStream();
newStream.Write(bytes, 0, bytes.Length);
newStream.Close();
}
try {
WebResponse response = http.GetResponse();
Stream stream = response.GetResponseStream();
StreamReader sr = new StreamReader(stream);
return sr.ReadToEnd();
}
catch (Exception ex) {
logger.Error(ex, $"{method} on {relativeUrl} failed");
Console.WriteLine(ex.Message);
}
Просто, чтобы попробовать что-то еще, я провел небольшой тест из Powershell и в итоге получил похожее сообщение об ошибке , Затем я добавил строку протокола безопасности в сценарий, и она работает:
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest -UseBasicParsing https://mysite/app/authenticate -ContentType "application/json" -Method POST -Body (@{"emailAddress"="somemail@address"; "password"="somepassword"}|ConvertTo-Json)
Есть идеи, почему это не работает с NET Core?