¿Cómo firmo un documento PDF con un certificado del Almacén de certificados de Windows?

Necesito firmar un documento PDF utilizando un certificado que existe en el Almacén de certificados de Windows. He estado cavando alrededor de todo el día tratando de resolverlo, y estoytan cerca todavíatan lejos.

Todo lo que falta es esto:¿Cómo obtengo un objeto IExternalSignature para firmar el archivo PDF?

Rahul Singla ha escrito un hermoso ejemplo de cómo firmar un documento PDF utilizando la nueva API iText 5.3.0 -Mientras puede acceder a un archivo .pfx sentado en su PC en algún lugar.

Ahi estauna pregunta previa al firmar con un certificado del Almacén de certificados de Windows, excepto que estaba usando una versión de la API dondeSetCrypto Todavía existe, y la firma era aparentemente opcional. En iText 5.3.0, la API ha cambiado, ySetCrypto ya no es una cosa

Esto es lo que tengo hasta ahora (comentarios agregados para la posteridad, ya que esta podría ser la versión más completa y reciente de cómo hacer esto en la red):

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();

Como puedes ver:Tengo todo menos la firma., y estoy perplejo en cuanto a cómo debo obtenerlo!

Respuestas a la pregunta(3)

Su respuesta a la pregunta