Что можно сделать, чтобы заставить SecurityProtocol работать, я получаю «Не удалось установить соединение SSL»? - PullRequest
1 голос
/ 28 апреля 2020

Я создаю 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?

1 Ответ

0 голосов
/ 29 апреля 2020

На самом деле это проблема "неправильного сервера". По какой-то причине мой запрос оказался на неправильном сервере, и это, очевидно, тот ответ / ошибка, которую вы получаете, когда запрашиваете что-то на сервере, на котором не размещен запрошенный сайт.

...