无法以编程方式检索通过 mmc 为服务帐户安装的证书
Cannot retrieve programmatically a certificate installed through mmc for a service account
我正在尝试将应用程序转变为服务 (.NET)。此服务必须通过 Web 服务(FileNet P8 .NET 凭证系统)登录远程服务器。
但是,URL 是 HTTPS,因此需要证书。
我按照 Microsoft's instructions 使用 MMC 为服务帐户安装证书。证书(自签名)安装在 Trusted Root Certification Authorities Certificate Store 中。 (免责声明:我还不太了解 MMC 是如何工作的,尤其是当使用 所做的更改有效时)。
证书存在于HKLM\SOFTWARE\Microsoft\Cryptography\ Services\<ServiceName>\SystemCertificates\Root\Certificates\<digitalFootprint>
。
但是,这段代码没有检索到证书:
' Environment.UserName = SERVICE LOCAL (french)
LOGGER.info("Certifs for " & Environment.UserName)
Dim store As X509Certificates.X509Store =
New X509Certificates.X509Store(X509Certificates.StoreName.Root,
X509Certificates.StoreLocation.CurrentUser)
store.Open(X509Certificates.OpenFlags.ReadOnly)
For Each certificate As X509Certificates.X509Certificate2 In store.Certificates
LOGGER.info(certificate.Issuer & ": " &
If(certificate.Verify, "Valid", "Invalid"))
Next
LOGGER.info("End Certifs")
当然,下面的测试代码失败了:
Dim wq As Net.WebRequest = Net.WebRequest.Create("https://<URL>")
Dim reader As IO.StreamReader = New IO.StreamReader(wq.GetResponse.GetResponseStream)
LOG.info(reader.ReadToEnd)
但是,如果我 运行 使用具有证书的用户帐户的服务,它 运行s。我做错了什么?
附加问题:有没有办法运行带有服务帐户的Internet Explorer 可以用它来执行证书安装? (作为解决方法)
曾经我也遇到过类似的行为..让我们看看下面的代码是否可以帮助你,记住我们的证书是个人证书:
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certificates = store.Certificates.Find(X509FindType.FindByIssuerName, "test.supportxxxx@test.com", true);
if (certificates.Count > 0)
{
// certificate found
}
.NET 不支持在服务帐户存储中查找证书。底层 API CertOpenStore function has support for service account stores via CERT_SYSTEM_STORE_CURRENT_SERVICE
and CERT_SYSTEM_STORE_SERVICES
values. .NET has support only for CERT_SYSTEM_STORE_LOCAL_MACHINE
and CERT_SYSTEM_STORE_CURRENT_USER
values in StoreLocation 枚举。
MMC 使用本机 APIs,因此您可以从 MMC 访问服务证书存储。这是 .NET 中的一种已知限制。克服它的唯一方法是直接使用 CertOpenStore
函数(通过 p/invoke)。
我正在尝试将应用程序转变为服务 (.NET)。此服务必须通过 Web 服务(FileNet P8 .NET 凭证系统)登录远程服务器。
但是,URL 是 HTTPS,因此需要证书。
我按照 Microsoft's instructions 使用 MMC 为服务帐户安装证书。证书(自签名)安装在 Trusted Root Certification Authorities Certificate Store 中。 (免责声明:我还不太了解 MMC 是如何工作的,尤其是当使用 所做的更改有效时)。
证书存在于HKLM\SOFTWARE\Microsoft\Cryptography\ Services\<ServiceName>\SystemCertificates\Root\Certificates\<digitalFootprint>
。
但是,这段代码没有检索到证书:
' Environment.UserName = SERVICE LOCAL (french)
LOGGER.info("Certifs for " & Environment.UserName)
Dim store As X509Certificates.X509Store =
New X509Certificates.X509Store(X509Certificates.StoreName.Root,
X509Certificates.StoreLocation.CurrentUser)
store.Open(X509Certificates.OpenFlags.ReadOnly)
For Each certificate As X509Certificates.X509Certificate2 In store.Certificates
LOGGER.info(certificate.Issuer & ": " &
If(certificate.Verify, "Valid", "Invalid"))
Next
LOGGER.info("End Certifs")
当然,下面的测试代码失败了:
Dim wq As Net.WebRequest = Net.WebRequest.Create("https://<URL>")
Dim reader As IO.StreamReader = New IO.StreamReader(wq.GetResponse.GetResponseStream)
LOG.info(reader.ReadToEnd)
但是,如果我 运行 使用具有证书的用户帐户的服务,它 运行s。我做错了什么?
附加问题:有没有办法运行带有服务帐户的Internet Explorer 可以用它来执行证书安装? (作为解决方法)
曾经我也遇到过类似的行为..让我们看看下面的代码是否可以帮助你,记住我们的证书是个人证书:
X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
var certificates = store.Certificates.Find(X509FindType.FindByIssuerName, "test.supportxxxx@test.com", true);
if (certificates.Count > 0)
{
// certificate found
}
.NET 不支持在服务帐户存储中查找证书。底层 API CertOpenStore function has support for service account stores via CERT_SYSTEM_STORE_CURRENT_SERVICE
and CERT_SYSTEM_STORE_SERVICES
values. .NET has support only for CERT_SYSTEM_STORE_LOCAL_MACHINE
and CERT_SYSTEM_STORE_CURRENT_USER
values in StoreLocation 枚举。
MMC 使用本机 APIs,因此您可以从 MMC 访问服务证书存储。这是 .NET 中的一种已知限制。克服它的唯一方法是直接使用 CertOpenStore
函数(通过 p/invoke)。