5

ページリクエストからクライアント証明書を取得するためのコードがあります。これは「MyPage.aspx」のコードです。

string someparam = this.Request.Params["someparam"];
if (!String.IsNullOrWhiteSpace(someparam) && this.Page.Request.ClientCertificate.IsPresent)
{
    try
    {
        X509Certificate2 x509Cert2 = new X509Certificate2(this.Page.Request.ClientCertificate.Certificate);
        //
        // Code for verifying the x509Cert2
        //
    }
    catch (Exception) { }
}

次に、ローカル環境のVisualStudioでコードをテストします。このために、IISExpressをインストールして、httpsを介した信頼できる通信を取得しました。ここまでは順調ですね。問題は、クライアント証明書を送信するためのテストコードが機能していないように見えることです。ClientCertificate.IsPresent = falseサーバーで。

以下はテストコードです。証明書は.pfxファイルです。

var request = (HttpWebRequest)WebRequest.Create("https://localhost:44300/MyPage.aspx?someparam=222");
request.Method = "POST";

X509Store store = new X509Store(StoreName.TrustedPeople, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection col = store.Certificates.Find(X509FindType.FindBySerialNumber, "XXXTHESERIALNUMBERXXX", true);
certFromStore = col[0];
store.Close();
request.ClientCertificates.Add(certFromStore);

HttpWebResponse reqWebResponse = (HttpWebResponse)request.GetResponse();
StreamReader reqResponseStream = new StreamReader(reqWebResponse.GetResponseStream(), Encoding.UTF8);

String resultHtml = reqResponseStream.ReadToEnd();

reqWebResponse.Close();
reqResponseStream.Close();

テストコードを実行してもエラーは発生しません。証明書はストアから正しくロードされ、request.ClientCertificatesコレクションに正常に追加されます。ただし、MyPage.aspxでは、ページ要求から証明書を取得できません。

誰かが私が欠けているものについての考えを持っていますか?

4

1 に答える 1

1

次の場所にある IIS Express インスタンスの構成ファイルでパラメーターを指定する必要があります。
C:\Users\[username]\Documents\IISExpress\config\applicationhost.config

セキュリティ要素を探す必要があります。

この要素は、IIS サーバーがクライアント証明書を受け入れるかどうかを制御します。属性 enabled を true に設定すると、次のようになります。

iisClientCertificateMappingAuthentication enabled="true"

access 要素は、アクセスの処理方法を制御します。sslFlags 属性は、クライアント証明書の処理方法を制御します。何らかの理由で、IIS が実際に要求に証明書を渡す唯一の方法は、sslFlags を値 SslNegotiateCert に次のように設定することです。

access sslFlags="SslNegotiateCert"

于 2012-09-21T03:44:32.927 に答える