正在读取 asp.net 中的所有证书

Reading all certificates from asp.net

我在读取证书时遇到问题。我有一个 网络服务 必须使用部分主题获得证书 序列号 。如果我从表单中进行操作,一切正常,但是当我从 Web 服务中尝试时,它似乎找不到任何证书。我正在使用此代码读取所有证书:

                        X509Store store = new X509Store();

                        store.Open(OpenFlags.ReadOnly);                    
if (args.Parameters["CertificateName"].ToString() != "")
                    {

                        foreach (X509Certificate2 mCert in store.Certificates)
                        {
                            if (mCert.Subject.Contains("OU=" + args.Parameters["CertificateName"].ToString()))
                            {
                                SerialNum = mCert.SerialNumber;
                                break;
                            }
                        }
                        if (SerialNum == String.Empty)
                        {
                            throw new Exception("Certificate not found with name: " + args.Parameters["CertificateName"].ToString() + " ;" + " OU=" + args.Parameters["CertificateName"]);
                        }
                    }
                    else
                    {

                        foreach (X509Certificate2 mCert in store.Certificates)
                        {
                            if (mCert.Subject.Contains("OU=Eua"))
                            {
                                SerialNum = mCert.SerialNumber;
                                break;
                            }
                        }
                        if (SerialNum == String.Empty)
                        {
                            throw new Exception("Haven't found default certificate ;");
                        }

                    }
store=null;

您正在使用 parameterless constructor for X509Store,根据文档,它将为当前用户打开证书存储区。那么,您的表单应用程序的当前用户可能与您的 Web 应用程序的当前用户不同,后者很可能在配置为使用服务帐户的 AppDomain 中运行。这意味着 Web 应用程序将无法找到它。

要解决此问题,您有两种选择

选项 1

首先将您的证书存储在机器存储(而不是用户存储)中。然后,在您的代码中,使用 a different constructor that lets you specify the store location 打开商店,并指定您想要机器商店。像这样:

var store = new X509Store(StoreLocation.MachineStore);

选项 2

维护证书的两份副本。请按照以下步骤操作:

  1. 从当前用户的证书库中导出证书
  2. 使用 "RunAs" 启动证书管理器以模拟应用程序域的服务帐户,例如runas /user:MyDomain\MyServiceAccount "cmd /c start /B certmgr.msc"。当出现提示时,确保你告诉它你想使用当前用户的证书存储,而不是机器存储。
  3. 在那里导入证书
  4. 打开证书并确保其信任链完好无损;如果缺少任何中间证书或根证书,您可能还必须导入它们。
  5. 请记住,当此证书过期时,您将不得不更换两个副本。