Wie melde ich ein PDF-Dokument mit einem Zertifikat vom Windows-Zertifikatsspeicher?
Ich muss signieren Sie ein PDF-Dokument mit einem Zertifikat, das vorhanden ist in den Windows-Zertifikatspeicher. Ich habe Graben rund um den ganzen Tag zu versuchen, es herauszufinden, und ich bin so nah noch so weit Weg.
Alles, was fehlt, ist dies: Wie bekomme ich ein IExternalSignature Objekt zum signieren der PDF-Datei?
Rahul Singla geschrieben hat, ein schönes Beispiel dafür, wie Sie sich ein PDF-Dokument mit dem neuen iText 5.3.0-API - solange können Sie den Zugriff ein .pfx-Datei, sitzen um auf dem PC irgendwo.
Es ist eine Vorherige Frage auf den Abschluss mit einem Zertifikat vom Windows-Zertifikatsspeicher, außer es wurde eine version der API, wo SetCrypto
noch vorhanden ist, und die Unterschrift war anscheinend optional. In iText 5.3.0, die API hat sich geändert, und das SetCrypto
ist nicht mehr eine Sache.
Hier ist, was ich habe, so weit (Kommentare für die Nachwelt, da diese vielleicht die vollständigste und aktuellste version, wie dies zu tun auf dem Netz):
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();
Wie Sie sehen können: ich habe alles, aber die Signatur, und ich bin ratlos, wie soll ich es erhalten!
InformationsquelleAutor doppelgreener | 2013-02-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn du die pk, die sich wie oben, erstellen Sie eine IExternalSignature wie folgt:
Möglicherweise finden Sie auch die folgenden Artikel verwenden:
signature
zu einemX509Certificate2
Objekt zuerst). Es gibt auch einige Zertifikat-Berechtigung Fragen, achtsam zu sein - werde ich hinzufügen, einige Informationen über diese später.InformationsquelleAutor Sam Shiles
Bitte laden Sie das Buch auf PDF und digitale Signaturen. Finden Sie ein Java-Beispiel dafür, wie Zeichen mit Hilfe der Windows-Zertifikatspeicher in Kapitel 3. Wie Sie sehen können, benötigen Sie den Windows-MY keystore.
Gehen Sie jetzt in das repository, wo wir veröffentlicht haben, die C# port für diese Beispiele. Suchen C3_11_SignWithToken.cs.
Wenn ich das richtig verstehe
chain
undpk
sind die Variablen, die Sie gesucht haben;pk
in diesem Fall ist nur ein X509Certificate2-Objekt.Gute code-Beispiel, aber ein bisschen verwirrend.
pk
interpretiert werden können, wie private Schlüssel, das ist es nicht...pk
ist das signierte Zertifikat.InformationsquelleAutor Bruno Lowagie
Ich diesen code verwenden, um
byte[]
PDF und wieder einbyte[]
PDF bereits unterzeichnet.Es ist iTextSharp-LGPL.
InformationsquelleAutor Frederico Monteiro