Это мой самый первый пост. Во-первых, я хотел бы поблагодарить всех за тот вклад, который вы внесли в этот сайт, поскольку это сделало мою работу в качестве младшего разработчика намного проще!
У меня проблема с рукопожатием сервера при использовании 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](https://i.stack.imgur.com/Wfw8n.png)
![wireshark snapshot 2](https://i.stack.imgur.com/SsoLY.png)
Я думаю, что все сводится к тому, как Скрипач и Почтальон справляются со своими рукопожатием и сертификатом. Но для меня все еще остается загадкой (или бедой в этом отношении!), Почему .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 ...: (