LoginSignup
21
16

More than 5 years have passed since last update.

HttpClient でクライアント証明書を設定する方法

Posted at

概要

クライアント証明書が必要なWebAPIを叩く場合は、リクエスト送信時にクライアント証明書を設定する必要がある。

以下、HttpClientクラスを用いたクライアント証明書の設定方法を説明する。

  • 参照設定に System.net.Http.WebRequest を追加する
  • WebRequestHandler にクライアント証明書を設定した X509Certificate2 を追加する
  • HttpClient 生成時に WebRequestHandler を設定する
  • HttpClient を用いてサーバへ要求を行う

ソース

using System.IO;
using System.Net.Http;
using System.Security.Cryptography.X509Certificates;

                // :

        public void MainProc(string[] args)
        {
            var url = @"http://hogefuga.com/";
            var certPath = @"C:\certFileName.p12"; // クライアント証明書ファイルへのパス
            var certPassword = "password";         // クライアント証明書ファイルのパスワード

            // クライアント証明書付きのハンドラを生成
            WebRequestHandler handler = this.CreateRequestHandler(certPath, certPassword);

            using (HttpClient client = new HttpClient(handler))
            {
                HttpResponseMessage response = client.GetAsync(url).Result;
                // :
            }
        }

        private WebRequestHandler CreateRequestHandler(string certPath, string certPassword)
        {
            // クライアント証明書読み込み
            X509Certificate2 x509 = new X509Certificate2(this.ReadFileAsBytes(certPath),
                                                         certPassword,
                                                         X509KeyStorageFlags.MachineKeySet);

            WebRequestHandler handler = new WebRequestHandler();
            handler.ClientCertificates.Add(x509);

            return handler;
        }

        private byte[] ReadFileAsBytes(string fileName)
        {
            using (var stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
            {
                byte[] rowData = new byte[(int)stream.Length];
                stream.Read(rowData, 0, rowData.Length);
                return rowData;
            }
        }

備考

  • X509Certificate2 生成時に X509KeyStorageFlags.PersistKeySet を使うとIIS経由のWebService から叩いた時にエラーとなったので X509KeyStorageFlags.MachineKeySet を用いた。PersistKeySet でもデバッグ実行時や exeを直接叩いた場合は問題なく動作していたので、呼び出すユーザによって使わける必要があるのかもしれない。
21
16
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
16