为什么X509Certificate2Collection不能在IIS中工作?
我写了一个ASP.NET MVC应用程序。在应用程序中,我写了一个名为GetClientCertificateCollection()的相当简单的方法。这种方法应该简单地返回当前用户的客户端证书。当我在VisualStudio 2013/IIS Express [调试模式]中执行此代码时,该逻辑完美工作,我可以毫无问题地处理用户的X509证书[我也检索服务器的证书,但我写过可以忽略它们,只处理通过有效的用户证书]。为什么X509Certificate2Collection不能在IIS中工作?
不幸的是,当我部署我的解决方案到IIS的Web服务器上的一个实例,该方法返回什么;字面上0证书。
我已经研究并尝试了一些建议,但我一直在寻找确凿的证据不成功。
我的IIS配置如下:1. 网站托管作为一个子目录的“默认Web站点”。 2.绑定 - 使用SSL证书启用端口443。 2.身份验证 - 全部禁用。 3. SSL设置 - 需要SSL /要求。
我希望有人能帮助我指出正确的方向。在此先感谢您的帮助。
public static X509Certificate2Collection GetClientCertificateCollection()
{
X509Store UserStore = new X509Store(StoreName.My, StoreLocation.CurrentUser)
try
{
UserStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
X509Certficate2Colllection certificatesInStore = UserStore.Certificates;
return certificatesInStore;
}
catch (Exception ex)
{
throw;
}
finally
{
UserStore.Close
}
}
我几乎可以100%肯定,你根本没有任何证书,只要你不把它们放到应用程序池的身份资料。
换句话说,你误以为你的应用程序非常相同的轮廓下,工作在IIS(个人资料),而事实上的应用程序池有另一种不同的身份集。
你必须检查你的应用程序池的设置,找到池下运行的身份,登录因为这样的身份,访问其证书存储,并把证书那里。如果您的应用程序池使用APP POOL
标识池,则这可能会有问题,您不能仅将该标识作为该池中的标识进行登录。在这种情况下,您必须切换到共享证书存储(机器存储),这是一个单一的证书存储由任何身份访问。
同意。请检查是否有任何证书。 –
我的应用程序必须能够识别安装在用户选择的浏览器中的个人证书。当我使用IE,Firefox或Chrome在调试模式下运行我的应用程序时;我可以通过上面的代码直接取得这些证书(我的证书)。但是,当我通过IIS使用上述任何浏览器运行相同的应用程序时,不会返回任何证书。 – Anonymous3521
如果我正确理解你,我的代码在调试模式下工作,因为我正在与我的用户商店一起运行应用程序。但是,当我将相同的代码移动到IIS时,我没有返回任何内容,因为在应用程序池用户的身份下没有安装证书。 – Anonymous3521
自从发布这个问题后,我学到了很多东西。当我最初发布这个问题时,我忽略了一些相当简单的障碍,我希望我的回答可以帮助那些可能与我一直在努力解决的问题斗争的人。
- 拉取浏览器证书的正确方法是利用HttpContext.Current.Request.ClientCertificate。这是使用X509Store的不正确方法。
- 如果您在使用HttpContext时收到不存在的证书,请调查您拨打电话的位置。如果使用MVC应用程序,则不能从Global.asax.cs中的Application_Start进行此调用。相反,将Application_BeginRequest方法添加到global.asax.cs类并从此位置调用HttpContext。
如果您试图从用户计算机(运行浏览器的计算机)获取客户端证书,则此操作无效 - 服务器无法访问客户端。如果您试图获得服务器将用于调用其他服务的客户端证书,那么您可能将证书存储在错误的证书存储中(请参阅Wiktor的答案)。 –
应用程序必须通过浏览器从用户计算机检索客户端证书,从而允许应用程序根据PKI证书所建立的身份验证用户。我正在看其他选项。不幸的是,我一直无法使用context.Request.ClientCertificate.IsPresent从请求中提取证书。任何其他想法? – Anonymous3521
使用'Request.ClientCertificate'是正确的方法。如果它不起作用,请参阅[此问题](https://stackoverflow.com/questions/6361738/asp-net-request-clientcertificate-returning-empty-on-iis-7)或者发布提供详细信息的其他问题。一些设置是必需的,你可能很容易错过一些。 –