我有一个托管在单独服务器上的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()
的日志记录。
但是以下代码(到同一个网址)
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()
的日志记录。
我错过了什么?为什么请求不会传递给托管代码?
答案 0 :(得分:2)
如果IIS配置为“接受”客户端证书,我认为如果没有提供,可能不一定拒绝访问,但如果提交了一个,则尝试验证它,如果失败则再给你403。 / p>
在这种情况下,似乎有理由认为403是准确的,因为证书有问题或者你如何管理它 - 很难说。其他可能的设置是“要求”和“忽略” - 可能尝试更改,看看是否有任何区别。
您编写的实际代码之外的许多外围环境可能会影响此过程,其详细信息未在您的问题中提供(可能因为它有点难)。我相信你已经意识到了这一点,但它很难提供一个针对性很强的答案。
您是否在Web服务器上安装了证书?证书需要作为链的一部分来解决,它本身或其发行者是可信任的。
使用X509Certificate2类生成证书时,会创建一个临时容器。当不再“引用”时,可以从该容器中删除私钥。要创建“永久”密钥容器,请使用X509KeyStorageFlags.PersistKeySet标志,如下所示:
var certData = new X509Certificate2(pathToPfxFile, password,
X509KeyStorageFlags.PersistKeySet);
以下是一些教程的链接:Client Certificate Validation in ASP.NET; The HttpWebRequest and Using Client Certificates
一般建议不要将证书信息存储在文件中,而是要使用证书存储。
[编辑] 根据您收到的错误实际上是403.16的新信息,标题中列出的问题的答案是:因为您的证书无效或IIS不信任,只要您的请求到达并且是被视为无效,引发403.16错误并拒绝请求。也就是说,在引发Application_BeginRequest事件之前,因此在您的日志记录代码有可能被执行之前。