3

我正在尝试使用 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 安装合适的证书后,这对我的本地用户帐户非常有用(为我的用户帐户添加证书管理单元并将其存储在Personal中),但不适用于服务(这次选择服务帐户,并选择我的服务) . 运行相同的代码会导致找不到合适的证书,即为空。此外,抛出一个,我认为这是 Syncfusion 端的一个错误。certificatePdfCertificate.GetCertificates()AccessViolationException

但是,我可以在没有 Syncfusion 代码的情况下重现同样的问题:

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

以我自己的用户身份运行,证书会显示出来(就像 MMC 中Personal下显示的所有其他证书一样),但是如果我调试服务(通过运行它,然后调用System.Diagnostics.Debugger.Launch()),我只会得到一个“CN=LOCAL SERVICE”证书,根本没有出现在MMC中。

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

4

3 回答 3

4

据我所知,Windows 机器帐户(如 LocalService)使用机器证书存储。这意味着在您的代码中,您必须使用StoreLocation.LocalMachine.

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

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

于 2012-12-20T21:34:00.787 回答
4

答案似乎是.NET 不支持在没有 P/Invoke 或类似的情况下访问服务帐户证书存储:

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

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

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

于 2012-12-24T14:44:51.043 回答
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-网络网络应用程序

于 2017-05-23T08:00:44.803 回答