正在读取 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
维护证书的两份副本。请按照以下步骤操作:
- 从当前用户的证书库中导出证书
- 使用 "RunAs" 启动证书管理器以模拟应用程序域的服务帐户,例如
runas /user:MyDomain\MyServiceAccount "cmd /c start /B certmgr.msc"
。当出现提示时,确保你告诉它你想使用当前用户的证书存储,而不是机器存储。
- 在那里导入证书
- 打开证书并确保其信任链完好无损;如果缺少任何中间证书或根证书,您可能还必须导入它们。
- 请记住,当此证书过期时,您将不得不更换两个副本。
我在读取证书时遇到问题。我有一个 网络服务 必须使用部分主题获得证书 序列号 。如果我从表单中进行操作,一切正常,但是当我从 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
维护证书的两份副本。请按照以下步骤操作:
- 从当前用户的证书库中导出证书
- 使用 "RunAs" 启动证书管理器以模拟应用程序域的服务帐户,例如
runas /user:MyDomain\MyServiceAccount "cmd /c start /B certmgr.msc"
。当出现提示时,确保你告诉它你想使用当前用户的证书存储,而不是机器存储。 - 在那里导入证书
- 打开证书并确保其信任链完好无损;如果缺少任何中间证书或根证书,您可能还必须导入它们。
- 请记住,当此证书过期时,您将不得不更换两个副本。