我正在尝试使用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。
答案 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”工具访问“本地计算机”证书存储区
这里详细描述: