Я пытаюсь подписать PDF-документ цифровой подписью с помощью Syncfusion PDF 10.4, например:
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 (добавление оснастки Certificates для Моя учетная запись пользователя и сохранение ее в Personal em>), но не для службы (на этот раз выбрав Учетная запись службы и выбрав мою службу). Выполнение того же кода приводит к тому, что подходящий сертификат не найден, т. Е. certificate
имеет значение null. Кроме того, 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)
{
…
}
При запуске от имени моего собственного пользователя сертификат отображается (как и все остальные, показанные в MMC в разделе Personal), но если я отлажу службу (запустив ее, а затем вызвав System.Diagnostics.Debugger.Launch()
), я получу только Сертификат "CN = LOCAL SERVICE", который вообще не отображается в MMC.
Я предполагаю, что мне нужно: A) сообщить ему об открытии правильного хранилища сертификатов или B) изменить что-то в способе установки или запуска службы, например, присвоить ей другой идентификатор, включить UserInteraction и т. Д. В настоящее время он работает с использованием LocalService и с отключенным UserInteraction.