【问题标题】:Service account cannot load the X509Certificate from windows certificate store服务帐户无法从 Windows 证书存储加载 X509Certificate
【发布时间】:2018-04-19 04:19:33
【问题描述】:

所有,我遇到了一个问题,我的 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;
    } 

关于 Load 方法为什么返回 null 的任何建议?

]3

【问题讨论】:

    标签: c# asp.net ssl x509certificate2


    【解决方案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;
        } 
    }
    

    【讨论】:

    • John WU,在根据您的输入进行代码更改后,我必须将 IIS 上的应用程序池设置上的 LoadUserProfile 设置为 True。然后它就像一个魅力
    • 仅供参考,您可以使用store.Certificates.Find(X509FindType.FindByThumbprint, thumbPrint, true) 而不是手动查找指纹。此外,由于Dispose 方法调用了Close 方法,因此无需在存储之前关闭它。
    【解决方案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。或者,如果您愿意,可以删除整个指纹和引号并再次键入它们。

    【讨论】:

    • 我可以确认这可能是问题所在。我曾经花了将近 5 个小时试图弄清楚发生了什么,这就是问题所在。您可以使用十六进制编辑器观察字符。
    猜你喜欢
    • 2020-01-24
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 2016-02-17
    • 2014-03-30
    • 2013-10-10
    相关资源
    最近更新 更多