Как подписать документ PDF с помощью сертификата из Windows Cert Store?

Мне нужно подписать документ PDF с помощью сертификата, который существует в хранилище сертификатов Windows. Я копался весь день, пытаясь понять это, и ятак близко все жетак далеко.

Все, чего не хватает, так это:Как получить объект IExternalSignature для подписи файла PDF?

Рахул Сингла написал прекрасный пример того, как подписать документ PDF с помощью нового API iText 5.3.0 -так долго как Вы можете получить доступ к файлу .pfx, сидя где-нибудь на вашем компьютере.

Естьпредыдущий вопрос при подписании с использованием сертификата из Windows Cert Store, за исключением того, что он использовал версию API, гдеSetCrypto все еще существует, и подпись была, по-видимому, необязательной. В iText 5.3.0 API изменился, иSetCrypto больше не вещь.

Вот что у меня есть (комментарии для потомков, поскольку это может быть самая полная и последняя версия того, как это сделать в сети):

using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;
using BcX509 = Org.BouncyCastle.X509;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Crypto;
using DotNetUtils = Org.BouncyCastle.Security.DotNetUtilities;

...

// Set up the PDF IO
PdfReader reader = new PdfReader(@"some\dir\SomeTemplate.pdf");
PdfStamper stamper = PdfStamper.CreateSignature(reader,
    new FileStream(@"some\dir\SignedPdf.pdf", FileMode.Create), '\0');
PdfSignatureAppearance sap = stamper.SignatureAppearance;

sap.Reason = "For no apparent raisin";
sap.Location = "...";

// Acquire certificate chain
var certStore = new X509Store(StoreName.My, StoreLocation.LocalMachine);
certStore.Open(OpenFlags.ReadOnly);

X509CertificateCollection certCollection =
    certStore.Certificates.Find(X509FindType.FindBySubjectName,
    "My.Cert.Subject", true);
X509Certificate cert = certCollection[0];
// iTextSharp needs this cert as a BouncyCastle X509 object; this converts it.
BcX509.X509Certificate bcCert = DotNetUtils.FromX509Certificate(cert);
var chain = new List<BcX509.X509Certificate> { bcCert };
certStore.Close();

// Ok, that's the certificate chain done. Now how do I get the PKS?
IExternalSignature signature = null; /* ??? */

// Sign the PDF file and finish up.
MakeSignature.SignDetached(sap, signature, chain, // the important stuff
    null, null, null, 0, CryptoStandard.CMS);
stamper.Close();

Как вы видете:У меня есть все, кроме подписии я озадачен тем, как я должен получить это!

Ответы на вопрос(3)

Ваш ответ на вопрос