如何自动化访问一个需要客户端证书的IIS网站?

3
我在一个IIS6/ASP.NET网站工作,必须“要求客户端证书”的形式是智能卡(特别是通用访问卡)。我需要创建一些服务,以定时访问各种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禁止访问的错误。


你正在使用SharePoint 2010吗? - Ryan Hayes
@Ryan Hayes:Sharepoint 2003,其余网站为ASP.NET 3.5。 - Scott Stafford
4个回答

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);
        }

所以在这个系统中有一个智能卡,它是如何相关的?我需要将卡作为流程的一部分,还是只需复制 .cer 文件即可? - Scott Stafford
您可以将证书导出为 .cer 文件,并从文件中加载。 - PerlDev
CAC智能卡存储在当前用户存储中,如示例所示。将其添加到request.ClientCertificates将在调用request.GetResponse()时提示输入PIN码。 - user423430

1

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


PIN是私钥吗?我认为不是,那么PIN又如何与公/私钥相关联呢? - Scott Stafford

0

如果您正在使用SharePoint 2010:

  1. 进入SharePoint中央管理
  2. 进入应用程序管理 > 管理Web应用程序
  3. 选择您的前端SharePoint站点。
  4. 从顶部菜单中选择“扩展”。

这样做的作用是创建一个单独的SharePoint站点,它使用完全相同的配置和内容数据库,但您可以将其托管在其他地方,并单独进行安全保护。这使您可以拥有正常的、安全的SharePoint实例,完全被锁定,同时在其他地方托管另一个版本,该版本具有不同的安全性,您可以授予其他访问权限,即需要运行索引或其他作业的服务。


有趣。不幸的是,我使用的是Sharepoint 2003而不是2010。我实际上需要访问站点中的多个URL,而不仅仅是Sharepoint的搜索索引。 - Scott Stafford

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();


@PerlDev:所以在这个系统中有一个智能卡,它是如何相关的?我需要将卡作为流程的一部分,还是只需复制 .cer 文件即可? - Scott Stafford
如果是这种情况,我会从智能卡中读取x509,如果您有正确的令牌驱动程序,应该可以做到这一点。 - Jason M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接