概要
クライアント証明書が必要な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を直接叩いた場合は問題なく動作していたので、呼び出すユーザによって使わける必要があるのかもしれない。