Клиент / Сервер Рукопожатие терпит неудачу при использовании RestSharp, но отлично работает на Postman и при использовании Fiddler в качестве прокси. Длина сертификата 0 - PullRequest
1 голос
/ 24 октября 2019

Это мой самый первый пост. Во-первых, я хотел бы поблагодарить всех за тот вклад, который вы внесли в этот сайт, поскольку это сделало мою работу в качестве младшего разработчика намного проще!

У меня проблема с рукопожатием сервера при использовании RestSharp. Я добавляю сертификат в POST-запрос RestSharp, но, похоже, он не проверяется должным образом. Однако точно такой же почтовый запрос с сертификатом, добавленным в Postman или выполняющий тот же код через Fiddler, поскольку прокси, кажется, работает нормально.

Я получаю сообщение об ошибке: Ошибка: System.Net.WebException: запрос был прерван: не удалось создатьБезопасный канал SSL / TLS.

Я полностью потерян. Я заменил информацию, которой не хотел делиться с ххххххххх.

            ServicePointManager.DefaultConnectionLimit = 9999;
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            ServicePointManager.ServerCertificateValidationCallback +=
               (sender, certificate, chain, sslPolicyErrors) => true;

            var client = new RestClient("xxxxxxxxxxxxxxxxxxx");


            X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
            store.Open(OpenFlags.ReadOnly);
            X509Certificate2Collection collection = store.Certificates.Find(X509FindType.FindBySubjectName, "xxxxxxxxx", true);

            client.ClientCertificates = new X509CertificateCollection();
            client.ClientCertificates.AddRange(collection);
            client.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;


            var request = new RestRequest(Method.POST);
            request.AddHeader("X-IBM-Client-Id", "xxxxxxxxxxxxxxx");
            request.AddHeader("X-IBM-Client-Secret", "xxxxxxxxxxxxxxxxxxxxxxxx");
            request.AddHeader("Accept", "*/*");
            request.AddHeader("Content-Type", "application/json");

            var jsonToSend = JsonConvert.SerializeObject(requestBody);
            request.AddParameter("application/json; charset=utf-8", jsonToSend, ParameterType.RequestBody);
            request.RequestFormat = DataFormat.Json;


            SecurityShower.ShowRestSharpRequest(client, request);

            IRestResponse response = client.Execute(request);


            return String.IsNullOrEmpty(response.Content) ? response.ErrorMessage : response.Content;

Я запустил Wireshark и обнаружил, что во время рукопожатия клиент (мы) отправляет certfifcate длина 0, поэтому я беру сертификат, который не включен, несмотря на то, что вы можете четковидите, я добавил сертификат клиенту RestSharp. И это показывает, когда я отлаживаю.

Пожалуйста, посмотрите на снимки Wireshark:

wireshark snapshot 1

wireshark snapshot 2

Я думаю, что все сводится к тому, как Скрипач и Почтальон справляются со своими рукопожатием и сертификатом. Но для меня все еще остается загадкой (или бедой в этом отношении!), Почему .Net обрабатывает этот процесс иначе, чем эти приложения!

РЕДАКТИРОВАТЬ: Дополнительная информация.

Я добавил этот код:

ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateServerCertificate);

(...)

  public static bool ValidateServerCertificate(
            object sender,
            X509Certificate certificate,
            X509Chain chain,
            SslPolicyErrors sslPolicyErrors)
        {

            Console.WriteLine("Validation of server cert.");
                return true;

}

И я обнаружил, что этот кусок кода не выполняется.

В любом случае - я не уверен, как углубиться в абстракцию с помощью .net, я не знаю, как программно повлиять на процедуру рукопожатия ... или если это вообще возможно в .net ...: (

...