如何自动访问具有“需要客户端证书”的IIS网站?

时间:2010-07-27 13:38:23

标签: c# iis x509certificate cac common-access-card

我在IIS6 / ASP.NET网站上工作,必须以智能卡的形式“需要客户端证书”(特别是Common Access Card)。我需要创建一些服务来访问计时器上的各种URL,以执行诸如更新搜索索引,预热Sharepoint页面和其他任务之类的操作。

如果除非您拥有智能卡上的证书,否则该网站不允许访问,如何做到这一点?我试图加载证书(.cer)并加载它像这样:

HttpWebRequest request = (HttpWebRequest)
            WebRequest.Create("https://.../someURL.html");

const string certFilename = @"my.cer";
var cert = X509Certificate2.CreateFromCertFile(certFilename);
cert.Import(certFilename, "my pin", X509KeyStorageFlags.Exportable);
request.ClientCertificates.Add(cert);
HttpWebResponse response = (HttpWebResponse)
       request.GetResponse();

但是我得到了403 Forbidden。

4 个答案:

答案 0 :(得分:1)

您可以按照以下方式从个人商店加载证书:

 System.Security.Cryptography.X509Certificates.X509Certificate cert = FindCertByName(PART_AFTER_CN_IN_CERT_SUBJECT);
request.ClientCertificates.Add(cert);

...

        private System.Security.Cryptography.X509Certificates.X509Certificate FindCertByName(string simpleName)
        {
            X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            foreach (X509Certificate cert in store.Certificates)
            {
                if( cert.Subject.Contains("CN="+simpleName))
                {
                    return cert;
                }
            }

            string msg = "The '" + simpleName + "' security certificate is not installed on this system!";
            throw new ApplicationException(msg);
        }

答案 1 :(得分:1)

这不是答案,但我没有足够的代表发表评论。 .cer不保存私钥,这只是公共证书,因此您无法使用它。您需要直接从智能卡加载私钥。我认为这可能涉及使用智能卡读卡器的CSP名称创建CSP参数,然后直接从卡中加载带有私钥的x509证书。据我所知,私钥不会自动安装到当前用户或当前机器的MY商店,因此您将无法从那里加载它。没有任何代码抱歉。

答案 2 :(得分:0)

如果您使用的是SharePoint 2010:

  1. 转到SharePoint管理中心
  2. 转到“应用程序管理”>管理Web应用程序
  3. 突出显示正面的SharePoint网站。
  4. 从顶部菜单中选择“扩展”。
  5. 这样做会创建一个单独的SharePoint站点,该站点使用完全相同的配置和内容数据库,但您可以将其托管在其他位置,并单独保护它。这允许您将正常,安全的SharePoint实例完全锁定,但同时在其他地方托管具有不同安全性的其他版本,您可以提供其他访问权限,即您需要运行索引或其他作业的服务

答案 3 :(得分:0)

您是否尝试将X509添加到凭据缓存中?例如:

X509Certificate cert = new X509Certificate("sslCert.txt"); X509CertificateCollection certColl = new X509CertificateCollection(); certColl.Add(cert); CredentialCache credCache = new CredentialCache(); credCache.Add(new Uri(string.Concat(outputReport.reportURI)), "Basic", new NetworkCredential(NexConfig.User, NexConfig.Pass)); wr.AllowAutoRedirect = false; wr.ClientCertificates = certColl; wr.Credentials = credCache; HttpWebResponse resp = (HttpWebResponse)wr.GetResponse();