【发布时间】:2020-10-16 08:32:12
【问题描述】:
我正在尝试将应用程序转变为服务 (.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)
但是,如果我使用具有证书的用户帐户运行服务,它就会运行。我做错了什么?
附加问题:有没有办法使用服务帐户运行 Internet Explorer 来执行证书安装? (作为一种解决方法)
【问题讨论】:
-
唯一的方法是在服务的模拟上下文中运行并查询“CurrentUser\My”存储。
-
@Crypt32,您的意思是向服务帐户添加证书毫无意义?如果可以,为什么可以通过 MMC 实现?
-
这是 .NET Framework API 的限制。 CryptoAPI 提供了这样的功能,它没有在 .NET 中实现。
-
.NET 在
X509Store类后面使用CertOpenStore函数。CertOpenStore支持服务帐户存储,.NET 实现不支持,因为它没有实现。
标签: .net vb.net windows-services windows-server-2008 x509certificate2