所有,我遇到一个问题,即我的ASP.NET Web表单应用程序(.Net Framework 4.6.1)运行的服务帐户无法从Windows 2012 R2服务器上的个人存储加载X509Certificate(.pfx)。以下是我将证书导入证书库的方法 我使用服务帐户(域\用户名)登录服务器,使用mmc snap in将证书导入当前用户个人证书存储区(请参见最后的屏幕截图)
这是我用来在C#中加载证书的代码。但是证书 为空
public X509Certificate2 Load()
{
X509Certificate2 x509Certificate = null;
var store = new X509Store(StoreName.My,StoreLocation.CurrentUser);
string thumbPrint = StripTheSpacesAndMakeItUpper(ConfigurationManager.AppSettings["pfxthumbPrint"]);
store.Open(OpenFlags.ReadOnly);
var certCollection = store.Certificates;
foreach (var x509 in certCollection)
{
if (x509.Thumbprint.Equals(thumbPrint))
{
x509Certificate = x509;
break;
}
}
store.Close();
return x509Certificate;
}
private string StripTheSpacesAndMakeItUpper(string thumbPrint)
{
if(!string.IsNullOrWhiteSpace(thumbPrint))
{
return Regex.Replace(thumbPrint, @"\s|\W", "").ToUpper();
}
return thumbPrint;
}
] 3
答案 0 :(得分:2)
我不知道你如何设定ConfigurationManager.AppSettings["pfxthumbPrint"]
的价值。我想您双击了CurrentUser商店中的证书并从详细信息选项卡中复制了指纹,对吧?如果是这种情况,您还会从指纹的开头复制一个不可见的字符。
最可悲的是,这个角色(我不知道它是什么)在app.config / web.config中不可见。摆脱if的唯一方法是delete the first quote character with the first character of the thumbprint and type them in again manually
。或删除整个指纹和引号,如果愿意,再次键入它们。
答案 1 :(得分:1)
而不是
if (x509.Thumbprint.Equals(x509CertificateFriendlyName))
不应该是
if (x509.Thumbprint.Equals(thumbPrint))
...
此外,您似乎将x509Certificate
声明为本地变量,然后将其丢弃。您是否打算将值分配给实例变量?我甚至没有看到return
声明。
此外,您不会处置您的商店,尽管这可能不是您的问题的原因。
这是一个解决这些问题的不同版本,也会消除配置条目中的任何不可见字符(请参阅pepo的答案)。
public X509Certificate2 Load()
{
var thumbPrintFromConfig = ConfigurationManager.AppSettings["pfxthumbPrint"]
var thumbPrint = Regex.Replace(thumbPrintFromConfig.ToUpper(),"[^A-F0-9]",""); //Keep only hex digits
return Load(thumbPrint);
}
private X509Certificate2 Load(string thumbPrint)
{
using (var store = new X509Store(StoreName.My,StoreLocation.CurrentUser))
{
store.Open(OpenFlags.ReadOnly);
var cert = store
.Certificates
.OfType<X509Certificate2>()
.Where(x => x.Thumbprint == thumbPrint)
.Single();
store.Close();
return cert;
}
}