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 似乎是准确的,因为证书有问题或您如何管理它 - 很难说。其他可能的设置是“要求”和“忽略” - 也许尝试更改,看看是否有任何不同。

除了您编写的实际代码之外,还有许多外围环境可能会影响此过程,您的问题中未提供详细信息(可能是因为这有点困难)。我相信您已经意识到这一点,但是很难提供有针对性的答案。

您是否在 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 回答