アプリケーションから安全なものを返す ASP.net Webservice (asmx) があります。証明書を使用してこのサービスに接続し、このメソッドを呼び出すクライアント アプリケーションを作成したいと考えています。証明書を使用して、この特別なクライアント アプリケーションだけがこの Web サービス メソッドを呼び出せるようにしたいと考えています。
インフラストラクチャのセットアップ方法に関する複雑な記事を何百も読みましたが、面倒なセットアップと非常に複雑な部分 (iE 証明書ストアのセットアップなど) のためにやめました。サービス メソッド内で証明書の検証を手動で行うことにしました。こうすることで、何が起こっているかを把握でき、複雑なサーバーのセットアップに頼る必要がなくなります。
しかし、問題は次のとおりです。どうすればそれを行うことができますか?
このスタブは、私がやりたいことを表しています:
[WebMethod]
public string GetSecureData() {
if(!ValidateClientCertificate()) {
throw new HttpException((int) (HttpStatusCode.BadRequest), "Bad Request");
}
return "i am secure";
}
private bool ValidateClientCertificate() {
HttpClientCertificate cert = HttpContext.Current.Request.ClientCertificate;
if (!cert.IsPresent || !HttpContext.Current.Request.IsSecureConnection) {
return false;
}
bool isValid = /* is cert the almighty client certificate? */
return isValid;
}
クライアント側では、次のようにします。
X509Certificate Cert = X509Certificate.CreateFromCertFile("C:\\secure.cer");
ServicePointManager.CertificatePolicy = new CertPolicy();
HttpWebRequest Request = (HttpWebRequest)WebRequest.Create("https://myserver/Secure.asmx/GetSecureData");
Request.ClientCertificates.Add(Cert);
Request.Method = "GET";
HttpWebResponse Response = (HttpWebResponse)Request.GetResponse();
ある種の「公開鍵」をアプリケーション (App_Data) に入れ、受け取ったクライアント証明書がこの公開鍵によって表されるものであるかどうかを確認できれば素晴らしいことです。
問題は次のとおりです。
- 最初のコード部分でコメントとして示されている魔法を行うにはどうすればよいですか?
- IIS と ASP.net が不明/未検証のクライアント証明書をブロックすると思います。この特別なサービス メソッドでは、このチェックを無効にする必要があります。
答えが簡単で、すでに何千回も答えられていても、私を責めないでください。このトピックに関する何千もの記事があり、100 の異なるソリューションとバリエーションがあります。私の問題に一致するものが見つかりませんでした。