Bosch Smart Home API C# Ошибка RestRequest «Запрос был прерван: не удалось создать безопасный канал SSL / TLS». - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь использовать RestSharp для вызова локального API Bosch Smart Home. Документация Bosch показывает, как использовать Postman для HTTP-запроса локального API, который правильно работает со всеми функциями. Я даже могу запросить список устройств после создания самозаверяющего сертификата и соответствующей настройки Postman. Поэтому я попытался разработать простой C# код для запроса того же списка через RestSharp.

static void RestGet()
        {
            System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
            const String WEBSERVICE_URL = "https://10.20.1.41:8444/smarthome/devices";
            const string certificate_path = @"C:\Users\niko\Documents\certificates\certificate.pfx";
            const string certificate_pass = "....";
            const string systemPassword = "...."; //encrypted in BASE64
            string ua = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0";

            ServicePointManager.Expect100Continue = true;
            ServicePointManager.DefaultConnectionLimit = 9999;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3;


            var client = new RestClient("https://10.20.1.41:8444/smarthome/devices");
            client.Timeout = 100000;
            X509Certificate2 cer = new X509Certificate2(certificate_path, certificate_pass);
            client.ClientCertificates = new X509CertificateCollection() { cer };
            var request = new RestRequest(Method.GET);
            request.AddHeader("Content-Type", "application/json");
            request.AddHeader("api-version", "1.0");
            request.AddHeader("Systempassword", systemPassword);
            IRestResponse response = client.Execute(request);
            Console.WriteLine(response.ErrorMessage);
            Console.WriteLine(response.Content);
            Console.ReadKey();
        }

По какой-то причине Сервер просто отправляет сообщение об ошибке «Запрос был прерван: не удалось создать безопасный канал SSL / TLS». Я пытался выяснить это в течение всего дня, но поскольку API довольно новый, никакой информации об этом пока нет.

1 Ответ

0 голосов
/ 08 февраля 2020

Итак. Как только я заметил, что запрос будет действительно успешным, пока Fiddler был открыт в фоновом режиме, я понял, что моя ошибка должна заключаться в том, как я загружаю сертификат в свою программу (поскольку Fiddler использует отдельный сертификат, который вы должны предоставить). Первое, что я сделал после того, как заметил это, - скопировал сертификат, который я предоставил Fiddler, в свой проект и загрузил его в программу. И НАКОНЕЦ РАБОТАЕТ! Я не могу сказать вам, как этот сертификат отличался от других.

...