如何访问存储在服务帐户中的X.509证书?

时间:2012-12-20 18:21:13

标签: c# x509 syncfusion

我正在尝试使用Syncfusion PDF 10.4对PDF文档进行数字签名,如下所示:

PdfLoadedDocument document = new PdfLoadedDocument(inputStream);
PdfCertificate certificate = PdfCertificate.FindBySubject(certificateStoreType, certificateSubjectName);

PdfSignature signature = new PdfSignature(document, document.Pages[0], certificate, "Signatur");
signature.Bounds = new RectangleF(new PointF(5, 5), new SizeF(100, 100));

在使用MMC安装合适的证书(为我的用户帐户添加证书管理单元并将其存储在中)后,这对我的本地用户帐户非常有用个人),但不是服务(这次选择服务帐户,并选择我的服务)。运行相同的代码导致找不到合适的证书,即certificate为空。此外,PdfCertificate.GetCertificates()会抛出AccessViolationException,我认为这是Syncfusion结尾的错误。

但是,如果没有Syncfusion代码,我可以重现同样的问题:

var store = new System.Security.Cryptography.X509Certificates.X509Store("My");
store.Open(System.Security.Cryptography.X509Certificates.OpenFlags.ReadOnly);
foreach (var item in store.Certificates)
{
    …
}

以我自己的用户身份运行,证书显示(与 Personal 下的MMC中显示的所有其他人一样),但如果我调试服务(通过运行它,然后调用{{1}) }),我只获得一个“CN = LOCAL SERVICE”证书,根本不会出现在MMC中。

我假设我需要A)告诉它打开正确的证书存储区,或者B)改变服务安装或运行方式,例如给它一个不同的身份,启用UserInteraction等。目前,它使用LocalService运行并禁用UserInteraction。

3 个答案:

答案 0 :(得分:4)

根据我的记忆,Windows机器帐户(如LocalService)使用机器证书存储。这意味着在您的代码中,您必须使用StoreLocation.LocalMachine访问商店。

var store = 
   new System.Security.Cryptography.X509Certificates.X509Store(StoreLocation.LocalMachine);

请注意,如果您决定以特定身份运行服务,则应首先以身份登录,然后将证书导入个人存储,然后使用StoreLocation.CurrentUser

答案 1 :(得分:4)

The answer appears to be .NET不支持在没有P / Invoke等的情况下访问服务帐户证书存储:

  

我认为任何.NET API都不允许访问服务证书存储区。

     

但是,您可以将证书安装到运行该服务的帐户的CurrentUser存储中。

我已将服务更改为在其自己的用户(不需要管理员权限)下运行,使用runas以该用户身份运行mmc.exe,并将证书导入该用户的个人存储区。

答案 2 :(得分:1)

我遇到了这个问题,要解决它必须允许“本地服务”帐户使用“WinHttpCertCfg”工具访问“本地计算机”证书存储区

这里详细描述:

https://support.microsoft.com/en-us/help/901183/how-to-call-a-web-service-by-using-a-client-certificate-for-authentication-in-an-asp-net-web-application