web-dev-qa-db-ja.com

RestSharpで要求に応じて証明書を追加する

サーバーと通信しようとしています。このサーバーは、リクエストを正常に実行するために、証明書と秘密鍵を私に送信します。

サーバーをテストするには、 Postman を使用します。だから私は郵便配達員に証明書の設定を記入し、私の要求はうまくいきます

Postman settings for certificates

今私は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#で機能するものなら何でも可能です

8
dpfauwadel

わかりました、私は解決策を得ました。

まず、証明書に.crtと.keyを使用するのをやめる必要がありました。 .pfxを入手する必要があります。これはopensslコマンドで実行できます( openssl documentation

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);
10
dpfauwadel