DotNetREST Client: System.Net.WebException — Es konnte kein SSL/TLS Kanal aufgebaut werden

#c# #.net #rest #ssl #tls1.2

#c# #.net #остальное #ssl #tls1.2

Вопрос:

Ich habe ein Problem einen REST Service mit einer einfachen DotNet Applikation aufzurufen. Ich habe das DotNet Framework 4.7.2 verwendet. Nachdem das nicht funktioniert hat habe ich auf dem gleichen Rechner mit Chrome den WebService aufgerufen und das funktioniert. Dann habe ich auf das Schloss geklickt und die Zertifikate der verwendeten Zertifikatskette exportiert und diese danach im Code importiert.

Ich bekomme aber immer noch diese Expeption, dass kein SSL/TLS Kanal etabliert werden konnte.

Русский: У меня проблема с вызовом службы REST с помощью простого приложения DotNet. Я использовал DotNet Framework 4.7.2. После того, как это не сработало, я вызвал веб-сервис на том же компьютере, что и Chrome, и он сработал. Затем я щелкнул по блокировке и экспортировал сертификаты используемой цепочки сертификатов, а затем импортировал их в код.

Но я все еще ожидаю, что канал SSL / TLS не может быть установлен.

     // Create a Web-Request to the ETR dispatcher
    HttpWebRequest req;
    req = (HttpWebRequest)WebRequest.Create("https://serviceurl/endpoint/healthCheck");

    // The path to the ROOT, SUB and App certificates.
    string rootCert = @"C:Users...Desktop_workroot.cer";
    string subCert  = @"C:Users...Desktop_worksub.cer";
    string appCert  = @"C:Users...Desktop_workapp.cer";

    // Load the certificates into an X509Certificate objects.
    X509Certificate2 cert1 = new X509Certificate2(rootCert);
    X509Certificate2 cert2 = new X509Certificate2(subCert);
    X509Certificate2 cert3 = new X509Certificate2(appCert);


    // Defined properties for the Web-Request
    req.Method = "GET";
    req.MediaType = "HTTP/1.1";
    req.ContentType = "application/json";
    req.UserAgent = "Example Client";

    // Add the three certificates to this request
    req.ClientCertificates.Add(cert1);
    req.ClientCertificates.Add(cert2);
    req.ClientCertificates.Add(cert3);

    // Ensure that TLS 1.2 is used
    ServicePointManager.Expect100Continue = true;
    ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

    // Send Web-Request and receive a Web-Response
    HttpWebResponse httpWebResponse = (HttpWebResponse)req.GetResponse();
    // ==> System.Net.WebException {“Die Anfrage wurde abgebrochen: Es konnte kein 
    //                               geschützter SSL/TLS-Kanal erstelle werden.”}
     

    // Translate data from the Web-Response to a string
    Stream dataStream = httpWebResponse.GetResponseStream();
    StreamReader streamreader = new StreamReader(dataStream, Encoding.UTF8);
    string response = streamreader.ReadToEnd();
    
    streamreader.Close();
 

Комментарии:

1. Возможно, вы захотите перевести свой вопрос на английский. Поскольку ваш код прокомментирован на английском языке, похоже, что вы можете это сделать.

2. Следующую строку необходимо переместить в начало кода: ServicePointManager. SecurityProtocol = SecurityProtocolType.Tls12;

3. ТАК же как и сайт на английском языке. Пожалуйста, отправьте свой вопрос на английском языке. Хотя существуют сайты, зависящие от языка, такие как pt.stackoverflow.com , ru, es, немецкого сайта нет, потому что на него мало спроса

4. В .NET 4.7.2 настройки TLS ОС используются по умолчанию. Во всех поддерживаемых ОС это TLS1.2. На какую ОС вы ориентируетесь? Если вы используете старую ОС, вам, вероятно, потребуется ее исправить. 3-4 года назад было несколько повторяющихся вопросов, поскольку все онлайн-сервисы начали требовать как минимум TLS1.2

5. Загружали ли вы сертификаты при использовании Chrome? Если код работает с Chrome, нет причин добавлять сертификаты с помощью c #. Вы администратор? Вы запускали код с VS? Попробуйте запустить в VS, щелкнув правой кнопкой мыши ярлык VS и выбрав Запуск от имени администратора.

Ответ №1:

Извините, что я не использовал английский. Это было что-то вроде автоматизации, которую я написал на немецком языке.

Но проблема решается без загрузки / импорта трех необходимых сертификатов.

Благодаря JDWENG, он заявил, что настройка версии протокола на Tls1.2 должна быть перенесена в начало.

Я предположил, что мне нужно настроить протокол до вызова веб-службы, но, очевидно, это влияет на создание объекта WevRequest.

После того, как я переместил его перед созданием объекта, все заработало. Часть кода с импортом 3 сертификатов не имела никакого эффекта, поэтому я удалил это.

спасибо всем…