根据要求使用RestSharp添加证书

dpf*_*del 5 c# x509certificate restsharp

我正在尝试与服务器通信。该服务器向我发送了证书和私钥,以便成功执行我的请求。

为了测试服务器,我使用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);
Run Code Online (Sandbox Code Playgroud)

该请求无效。我认为问题出在我如何在RestSharp中加载证书。

我正在寻找有关如何在RestSharp中正确设置证书的信息。

我正在使用RestSharp,但我可以在C#中使用任何其他工具

dpf*_*del 7

好的,我找到了解决方案。

首先,我必须停止使用.crt和.key作为证书。我必须得到一个.pfx。这可以通过openssl命令来完成(openssl文档

openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
Run Code Online (Sandbox Code Playgroud)

创建证书后,只需将其添加到请求中即可

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);
Run Code Online (Sandbox Code Playgroud)

  • 添加此行 `System.Net.ServicePointManager.ServerCertificateValidationCallback += (s, cert, chain, sslPolicyErrors) => true;` 后,这对我有用 - 我希望这对其他人可能有用。 (3认同)