我在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。
答案 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:
这样做会创建一个单独的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();