2

別のサーバーでホストされている ASP.NET アプリケーションがあります。Application_BeginRequest()Global.asax.cs で配線しました

protected void Application_BeginRequest(Object sender, EventArgs e)
{
  //logging here      
}

ここで、自己署名証明書を使用して .pfx ファイルを作成し、その証明書を使用してサーバー上の URL を要求しようとしました。

次のコードは正常に実行されます。

String url = "https://myserver.com/MyController/Magic";
var request = (HttpWebRequest)WebRequest.Create(url);
var response = request.GetResponse();

ログからApplication_BeginRequest()のログが表示されます。

しかし、次のコード (まったく同じ URL へ)

String url = "https://myserver.com/MyController/Magic";
var request = (HttpWebRequest)WebRequest.Create(url);
var certData = File.ReadAllBytes(pathToPfxFile);
var cert = new X509Certificate2(certData, password);
request.ClientCertificates.Add(cert);
var response = request.GetResponse();

証明書のみをロードしてリクエストに添付するだけで、常に HTTP 403.16 が生成さApplication_BeginRequest()れ、ログにログが表示されません。

私は何が欠けていますか?要求がマネージ コードに渡されないのはなぜですか?

4

1 に答える 1

2

IIS がクライアント証明書を「受け入れる」ように構成されている場合、クライアント証明書が提供されていない場合は必ずしもアクセスを拒否するとは限りませんが、送信された場合は検証を試み、失敗した場合はさらに 403 を返します。

このシナリオでは、証明書または証明書の管理方法に何か問題があるという点で、403 が正確であることはもっともらしいと思われます。他に考えられる設定は「require」と「ignore」です。変更してみて、違いがあるかどうかを確認してください。

このプロセスに影響を与える可能性のある実際のコードの外には、多くの周辺状況がありますが、その詳細は質問では提供されていません (おそらく難しいため)。すでにご存じだと思いますが、的を絞った回答を提供することが難しくなっています。

Web サーバーに証明書をインストールしましたか? 証明書は、それ自体またはその発行者が信頼されているチェーンの一部として解決する必要があります。

X509Certificate2 クラスを使用して証明書を生成すると、一時コンテナーが作成されます。秘密鍵は、「参照」されなくなったら、このコンテナから削除できます。「永続的な」キー コンテナーを作成するには、次のように X509KeyStorageFlags.PersistKeySet フラグを使用します。

var certData = new X509Certificate2(pathToPfxFile, password,
                                           X509KeyStorageFlags.PersistKeySet);

いくつかのチュートリアルへのリンクを次に示します。 ASP.NET でのクライアント証明書の検証HttpWebRequest とクライアント証明書の使用

一般的な推奨事項は、証明書情報をファイルに保存するのではなく、証明書ストアを使用することです。

[編集] 実際に受け取ったエラーは 403.16 であるという新しい情報に基づいて、見出しに記載されている質問に対する答えは次のとおりです。証明書が無効であるか、IIS によって信頼されていないため、リクエストがヒットするとすぐに無効であると見なされ、403.16 エラーが発生し、要求が拒否されます。つまり、Application_BeginRequest イベントが発生する前、つまりログ記録コードが実行される前です。

于 2013-05-28T13:16:18.317 に答える