无法以编程方式检索通过 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)。