Saltar al contenido

Firmar PDF con iTextSharp 5.3.3 y token USB

Posterior a de nuestra prolongada búsqueda de datos resolvimos esta obstáculo que tienen algunos lectores. Te dejamos la respuesta y esperamos serte de mucha ayuda.

Solución:

Este enfoque funciona bien para nosotros (iTextSharp 5.3.3). Usamos tarjetas inteligentes y tokens USB (proveedor: www.author.kiev.ua):

            X509Store store = new X509Store(StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(store.Certificates, null, null, X509SelectionFlag.SingleSelection);

            X509Certificate2 cert = sel[0];

            Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
            Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] 
            cp.ReadCertificate(cert.RawData);

            IExternalSignature externalSignature = new X509Certificate2Signature(cert, "SHA-1");

            PdfReader pdfReader = new PdfReader(pathToBasePdf);

            signedPdf = new FileStream(pathToBasePdf, FileMode.Create);

            pdfStamper = PdfStamper.CreateSignature(pdfReader, signedPdf, '');
            PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;

            signatureAppearance.SignatureGraphic = Image.GetInstance(pathToSignatureImage);
            signatureAppearance.SetVisibleSignature(new Rectangle(100, 100, 250, 150), pdfReader.NumberOfPages, "Signature");
            signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION;

            MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS);

He creado un proyecto ac # que puede firmar un PDF de la tienda de Windows, SmartCard o un archivo Pfx / P12. Puede ser útil para usted.

using System;
using System.Windows.Forms;
using System.IO;

using System.Security;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;

using iTextSharp.text.pdf;
using iTextSharp.text.pdf.security;



namespace SignPdf

    public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        
        private  SecureString GetSecurePin(string PinCode)
        
            SecureString pwd = new SecureString();
            foreach (var c in PinCode.ToCharArray()) pwd.AppendChar(c);
            return pwd;
        
        private  void button1_Click(object sender, EventArgs e)
         (KeyContainerName == ""))
            
                MessageBox.Show("You must set Provider Name and Key Container Name");
                return;
            
            foreach (X509Certificate2 cert2 in store.Certificates)
            
                if (cert2.HasPrivateKey)
                
                    RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert2.PrivateKey;
                    if (rsa == null) continue; // not smart card cert again
                    if (rsa.CspKeyContainerInfo.HardwareDevice) // sure - smartcard
                    
                        if ((rsa.CspKeyContainerInfo.KeyContainerName == KeyContainerName) && (rsa.CspKeyContainerInfo.ProviderName == ProviderName))
                        
                            //we find it
                            cert = cert2;
                            break;
                        
                    
                
            
            if (cert == null)
            
                MessageBox.Show("Certificate not found");
                return;
            
            SignWithThisCert(cert);
        

        private void button2_Click(object sender, EventArgs e)
        
            //Sign with certificate selection in the windows certificate store
            X509Store store = new X509Store(StoreLocation.CurrentUser);
            store.Open(OpenFlags.ReadOnly);
            X509Certificate2 cert = null;
            //manually chose the certificate in the store
            X509Certificate2Collection sel = X509Certificate2UI.SelectFromCollection(store.Certificates, null, null, X509SelectionFlag.SingleSelection);
            if (sel.Count > 0)
                cert = sel[0];
            else
            
                MessageBox.Show("Certificate not found");
                return;
            
            SignWithThisCert(cert);
        

        private void button3_Click(object sender, EventArgs e)
        
            //Sign from certificate in a pfx or a p12 file
            string PfxFileName = textBox5.Text;
            string PfxPassword = textBox6.Text;
            X509Certificate2 cert = new X509Certificate2(PfxFileName, PfxPassword);
            SignWithThisCert(cert);
        

        private void SignWithThisCert(X509Certificate2 cert)
        
            string SourcePdfFileName = textBox1.Text;
            string DestPdfFileName = textBox1.Text + "-Signed.pdf";
            Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
            Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[]  cp.ReadCertificate(cert.RawData) ;
            IExternalSignature externalSignature = new X509Certificate2Signature(cert, "SHA-1");
            PdfReader pdfReader = new PdfReader(SourcePdfFileName);
            FileStream signedPdf = new FileStream(DestPdfFileName, FileMode.Create);  //the output pdf file
            PdfStamper pdfStamper = PdfStamper.CreateSignature(pdfReader, signedPdf, '');
            PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;
            //here set signatureAppearance at your will
            signatureAppearance.Reason = "Because I can";
            signatureAppearance.Location = "My location";
            signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION;
            MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS);
            //MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CADES);
            MessageBox.Show("Done");
        

    



El mismo código que el anterior, pero utiliza un archivo de certificado en lugar de almacenar para firmar un documento PDF en la última página.

 X509Certificate2 cert = new X509Certificate2("C:\mycert.p12");

 Org.BouncyCastle.X509.X509CertificateParser cp = new Org.BouncyCastle.X509.X509CertificateParser();
 Org.BouncyCastle.X509.X509Certificate[] chain = new Org.BouncyCastle.X509.X509Certificate[] 
 cp.ReadCertificate(cert.RawData);

 IExternalSignature externalSignature = new X509Certificate2Signature(cert, "SHA-1");

 PdfReader pdfReader = new PdfReader("C:\multi-page-pdf.pdf");

 var signedPdf = new FileStream("C:\multi-page-pdf-signed.pdf", FileMode.Create);

 var pdfStamper = PdfStamper.CreateSignature(pdfReader, signedPdf, '');
 PdfSignatureAppearance signatureAppearance = pdfStamper.SignatureAppearance;

 signatureAppearance.SignatureGraphic = Image.GetInstance("C:\logo.png");
 signatureAppearance.Reason = "Because I can";
 signatureAppearance.Location = "My location";
 signatureAppearance.SetVisibleSignature(new Rectangle(100, 100, 250, 150), pdfReader.NumberOfPages, "Signature");
 signatureAppearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.GRAPHIC_AND_DESCRIPTION;

 MakeSignature.SignDetached(signatureAppearance, externalSignature, chain, null, null, null, 0, CryptoStandard.CMS);

Copie, pegue, importe las bibliotecas necesarias y comience a trabajar en otra cosa.

Eres capaz de añadir valor a nuestra información cooperando tu veteranía en las críticas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *