2017-01-04 4 views
0
eine PDF ohne private Schlüssel mit iText7

Ich Auswertung iText7 und verwalten keine pdf mit einem selbst signierten Zertifikat signieren, die keinen privaten Schlüssel hat.Anmeldung

Ich versuche, dies zu tun:

 X509Store store = new X509Store(StoreLocation.CurrentUser); 

     store.Open(OpenFlags.ReadOnly); 
     var certs = store.Certificates.Find(X509FindType.FindBySubjectName, "MyName", false); 
     var refDate = DateTime.MinValue; 
     X509Certificate2 certificate = certs[0]; 

     var pk = DotNetUtilities.GetKeyPair(certificate.PrivateKey).Private; //how to do without private key ???? 

     IExternalSignature pks = new PrivateKeySignature(pk, "SHA-256"); 
     var bCert = DotNetUtilities.FromX509Certificate(certificate); 
     var chain = new Org.BouncyCastle.X509.X509Certificate[] {bCert}; 
     using (var reader = new PdfReader(@"D:\Test\ToSign.pdf")) 
     using (var stream = new FileStream(@"D:\Test\Signed.pdf", FileMode.OpenOrCreate)) { 
      PdfSigner signer = new PdfSigner(reader, stream, false); 
      signer.SignDetached(pks, chain, null, null, null, 0, PdfSigner.CryptoStandard.CMS); 
     } 

verstehe ich, dass ich einen privaten Schlüssel sicher sein zu können, verwenden sollte, zu identifizieren, die das PDF unterzeichnet, aber unsere aktuelle PDF-Bibliothek, die eine ist Die COM-Komponente verwaltet die PDF-Datei ohne einen privaten Schlüssel.

Können Sie mir sagen, wie das gleiche zu tun?

Grüße

+3

Es ist * immer * ein privater Schlüssel. Sie können keine digitale Signatur ohne einen privaten Schlüssel erstellen, daher ist Ihre Behauptung, dass Ihre aktuelle PDF-Bibliothek es schafft, die PDF-Datei ohne einen privaten Schlüssel zu signieren, falsch. Vielleicht sprechen Sie nicht von einer echten ** digitalen Signatur ** (was PKI impliziert). Vielleicht wissen Sie nicht, dass ein privater Schlüssel verwendet wird (z. B. Sie erwähnen PKCS # 12; aber vielleicht verwendet Ihre Bibliothek PKCS # 11). –

+0

.Net-Sicherheitsbibliotheken verwenden manchmal Klassen- und Methodennamen, die darauf hindeuten, dass nur ein Zertifikat gemeint ist, während tatsächlich ein Zertifikat plus (optional) ein passender privater Schlüssel vorhanden ist. Z.B. das [X509Certificate2] (https://msdn.microsoft.com/en-us/library/windows/desktop/system.security.cryptography.x509certificates.x509certificate2 (v = vs.100) .aspx). – mkl

+0

Die Bibliothek automatisch die PDF unterzeichnen, wenn ein PDFA Archiv tun, wenn die folgenden Eigenschaften festgelegt: _conversion.CertificateName = _signature.CertificatDelivreA; _conversion.Issuer = _signature.CertificatDelivrePar; Es verwendet das Zertifikat im Windows-Zertifikatsspeicher gespeichert und das Zertifikat hat keinen privaten Schlüssel eingebettet (in meinem Beispiel cert [0]. HasPrivateKey ist falsch). Ich weiß nicht, wie aber eine Unterschrift angewendet wird und Adobe Reader sagt eindeutig, dass die Unterschrift nicht verifiziert werden kann. – PatriceVB

Antwort

1

Wie die anderen in den Kommentaren erwähnt: Wenn es einen öffentlichen Schlüssel gibt es immer einen privaten Schlüssel (die Sie nicht haben kann).

Aber eine Möglichkeit ist, dass der COM-Komponente, die die öffentlichen Schlüssel für die Signierung verwendet. Bei der asymmetrischen Verschlüsselung könnten Sie

  • verschlüsseln mit dem privaten Schlüssel und entschlüsselt mit dem öffentlichen Schlüssel (digitale Signatur genannt, die für die PDF-Signatur verwendet wird) OR
  • Sie mit dem öffentlichen Schlüssel verschlüsseln und entschlüsseln mit dem privaten Schlüssel (genannt Verschlüsselung, die in PGP verwendet wird).

Vielleicht diese Komponente den öffentlichen Schlüssel verwendet (anstelle der private Schlüssel) für die Unterzeichnung, aber wie bereits erwähnt Sie sind dann nicht Lage, das Dokument seit im PDF-Unterzeichnung (normaly) den öffentlichen Schlüssel, um zu überprüfen ist angebracht zur Unterschrift. Wenn ein PDF-Reader/eine Bibliothek das Dokument erhält, wird ein Fehler beim Überprüfen des Dokuments ausgelöst.

zu „emulieren“, dass das Verhalten in iText Sie den öffentlichen Schlüssel aus dem Zertifikat nehmen und sie in einen privaten Schlüssel konvertieren und zum Signieren verwenden. Dies ist jedoch nicht sinnvoll und würde wahrscheinlich beschädigte PDF-Dateien erstellen, die nicht verifizierbar sind. Also ich Rat dagegen ...

+1

* "Vielleicht verwendet diese Komponente den öffentlichen Schlüssel (statt des privaten Schlüssels) zum Signieren von" * - aber das würde keinen Sinn ergeben, oder? Da der öffentliche Schlüssel Teil des Zertifikats ist, könnte jeder mit dem Zertifikat das fälschen. – mkl

+0

* "Das macht aber keinen Sinn" * um meinen Beitrag zu zitieren ;-) – Lonzak

+0

Ehem, ja. ;) [In meinem Kommentar habe ich nur den generischen Teil betrachtet, nicht den iText-verwandten Teil, also habe ich das kühne Zeug übersehen ...] – mkl

Verwandte Themen