当客户端请求具有自签名证书时,为什么不调用我的Application_BeginRequest() ?

本文关键字:Application 我的 调用 为什么不 BeginRequest 请求 客户端 证书 | 更新日期: 2023-09-27 18:15:46

我有一个ASP。. NET应用程序,该应用程序托管在单独的服务器上。我在Global.asax.cs中连接了Application_BeginRequest()

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()的日志。

我错过了什么?为什么请求不能传递给托管代码?

当客户端请求具有自签名证书时,为什么不调用我的Application_BeginRequest() ?

如果IIS配置为"接受"客户端证书,我认为如果没有提供证书,它不一定会拒绝访问,但如果提交了证书,它会尝试验证它,如果失败,还会给你一个403。

在这种情况下,403似乎是正确的,因为证书或您管理它的方式有问题——很难说。其他可能的设置是"要求"answers"忽略"-也许试着改变一下,看看是否有什么不同。

在您编写的实际代码之外有许多外围环境可能会影响此过程,您的问题中没有提供这些细节(可能是因为它有点困难)。我相信你已经意识到了这一点,但这让你很难给出一个有针对性的答案。

您是否在web服务器上安装了证书?证书需要解析为链的一部分,在这个链中,它本身或它的颁发者是受信任的。

当使用X509Certificate2类生成证书时,将创建一个临时容器。当不再"引用"时,私钥可能会从此容器中删除。要创建"永久"密钥容器,请使用X509KeyStorageFlags。PersistKeySet标志,如下所示:

var certData = new X509Certificate2(pathToPfxFile, password,
                                           X509KeyStorageFlags.PersistKeySet);
下面是一些教程的链接:ASP.NET中的客户端证书验证;HttpWebRequest和使用客户端证书。

一般建议不将证书信息存储在文件中,而是使用证书存储。

[编辑]根据您收到的错误实际上是403.16的新信息,您的问题的答案如标题中所列的那样是:因为您的证书无效或不受IIS信任,因此一旦您的请求命中它并被视为无效,就会引发403.16错误并拒绝请求。也就是说,在Application_BeginRequest事件被引发之前,因此在日志代码有机会被执行之前。