Добавление сертификата по запросу с помощью RestSharp

#c# #.net #rest #asp.net-core

#c# #x509certificate #restsharp

Вопрос:

Я пытаюсь связаться с сервером. Этот сервер отправляет мне сертификат и закрытый ключ, чтобы успешно выполнить мой запрос.

Для тестирования сервера я использую Postman. Итак, я заполняю параметр сертификата в postman, и мой запрос работает нормально

Настройки Postman для сертификатов

Теперь я хочу сделать то же самое в C #.

Для этого я использую RestSharp для создания запроса.

Вот мой код

  var client = new RestClient(url);

 byte[] certBuffer = UtilsService.GetBytesFromPEM(myCertificate, Models.Enum.PemStringType.Certificate);
 byte[] keyBuffer = UtilsService.GetBytesFromPEM(encryptedPrivateKey, Models.Enum.PemStringType.RsaPrivateKey);

 X509Certificate2 certificate = new X509Certificate2(certBuffer, secret);
 client.ClientCertificates = new X509CertificateCollection() { certificate };
 var request = new RestRequest(Method.POST);
 request.AddHeader("Cache-Control", "no-cache");
 request.AddHeader("Accept", "application/json");
 request.AddHeader("Content-Type", "application/json");
 request.AddParameter("myStuff", ParameterType.RequestBody);
 IRestResponse response = client.Execute(request);
 

Запрос не работает. Я думаю, проблема в том, как я загружаю сертификат в RestSharp.

Я ищу информацию о том, как правильно установить сертификат в RestSharp.

Я использую RestSharp, но я мог бы использовать что-нибудь еще, что может работать на C#

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

1. Не знаю, используете ли вы его или нет, но в Postman есть встроенная функция, с помощью которой вы можете экспортировать свой запрос для большинства известных языков. C # является одним из них, и он использует библиотеку RestSharp. Просто нажмите кнопку code в правом верхнем углу экрана и выберите c #. Если вы уже знаете об этом, это может показаться очевидным, извините за это!

2. Да, я уже генерирую код таким образом. Но это не учитывает сертификаты…

3. Понял. Извините, я хотел бы, но я не знаю, как вам помочь.

Ответ №1:

Хорошо, я нашел решение.

Прежде всего, мне пришлось прекратить использование .crt и .key для сертификата. Я должен получить .pfx. Это можно сделать с помощью команды openssl (документация openssl)

 openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
 

После создания сертификата просто добавьте его в запрос следующим образом

 var client = new RestClient(url);

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

var certFile = Path.Combine(certificateFolder, "certificate.pfx");
X509Certificate2 certificate = new X509Certificate2(certFile, onboard.authentication.secret);
client.ClientCertificates = new X509CertificateCollection() { certificate };
client.Proxy = new WebProxy();
var restrequest = new RestRequest(Method.POST);
restrequest.AddHeader("Cache-Control", "no-cache");
restrequest.AddHeader("Accept", "application/json");
restrequest.AddHeader("Content-Type", "application/json");
restrequest.AddParameter("myStuff", ParameterType.RequestBody);
IRestResponse response = client.Execute(restrequest);
 

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

1. 1 к обоим вопросам и ответам. Я потратил час на поиск простого решения. Наконец, что-то, что работает. Спасибо!!

2. спасибо, спасибо, спасибо вам 1000 раз спасибо. Часами искал и боролся за это очень простое решение

3. Это сработает для меня после добавления этой строки System.Net.ServicePointManager.ServerCertificateValidationCallback = (s, cert, chain, sslPolicyErrors) => true; — я надеюсь, что это может быть полезно для других.

4. Спасибо! для тех людей, которые застряли, также выполняя команду, добавьте это в конец вашего командного пропуска: myPassWord

5. Я смог использовать файл .p12 вместо .pfx. var certFile = Path.Combine("C:\Projects\Certs\", "CERTFILE_SHA2.p12");