2017-12-15 19 views
1

Ich versuche digitale Signatur zu PDF-Dokument mit PDF-Box-Bibliothek (v2.0.8) hinzufügen. Ich erhalte bereits signierte Inhalte von einem Webservice (nur mit privatem Schlüssel signiert). Jetzt müsste ich diesen signierten Daten Zertifikatsinformationen zuordnen, damit sie zum PDF-Dokument hinzugefügt werden können. Wie können wir bereits signierten Inhalten ein Zertifikat hinzufügen, vorzugsweise mit Hüpfburg-API?Wie können Zertifikatsinformationen mit bereits signierten Daten verknüpft werden?

// here content is data which has to be signed 
public byte[] sign(InputStream content) throws IOException { 
     try { 
      CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); 
      List<Certificate> certList = new ArrayList<Certificate>(); 
      certList.add(certificate); 
      Store certs = new JcaCertStore(certList); 
      gen.addCertificates(certs); 

      CMSProcessableInputStream msg = new CMSProcessableInputStream(signPrivate(content)); 
      CMSSignedData signedData = gen.generate(msg, false); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      DEROutputStream dos = new DEROutputStream(baos); 
      dos.writeObject(signedData.toASN1Structure()); 
      return baos.toByteArray(); 
     } catch (Exception e) { 
      throw new IOException(e); 
     } 
    } 

Hier kann ich digitale Signatur generieren, aber es enthält keine Zertifikatsinformationen. Ich überprüfte bereits this und this Frage, aber sie nehmen nicht den Fall, in dem Inhalt bereits unter Verwendung des privaten Schlüssels seperatly unterzeichnet wird und nur das Zertifikat verbunden werden muss.

+1

In allen ernst zu nehmenden CMS-Signaturprofilen benötigen Sie die fraglichen Zertifikate * bevor * die Signaturen erstellt werden, da eine Referenz auf das fragliche Zertifikat Teil der signierten Daten ist. – mkl

+0

@mkl, meinst du zu sagen, dass wir das Zertifikat später nicht zuordnen können und es nur zum Zeitpunkt der Signierung von Inhalten mit privatem Schlüssel möglich ist? –

Antwort

1

(Der Code, den Sie bezieht sich auf CMS-Signatur-Container geschrieben, so dass ich davon ausgehen, sprechen wir über adbe.pkcs7.detached oder ETSI.CAdES.detached PDF-Signaturen.)

Wenn eine Signatur zu schaffen, in Bei einem CMS-Signaturcontainer hat man die Wahl, ob der Signaturwert wirklich nur die (Hash-) Dokumentdaten signiert oder ob er eine Sammlung von so genannten signierten Attributen (signedAttrs in der Spezifikation SignerInfo) und den Hash des Dokumentdaten sind nur ein Wert eines dieser Attribute.

SignerInfo ::= SEQUENCE { 
    version CMSVersion, 
    sid SignerIdentifier, 
    digestAlgorithm DigestAlgorithmIdentifier, 
    signedAttrs [0] IMPLICIT SignedAttributes OPTIONAL, 
    signatureAlgorithm SignatureAlgorithmIdentifier, 
    signature SignatureValue, 
    unsignedAttrs [1] IMPLICIT UnsignedAttributes OPTIONAL } 

(RFC 5652 section 5.3. SignerInfo Type)

Alle Profile hiervon ernst genommen werden, verlangen aber, dass Sie signierte Attribute verwenden, insbesondere sie benötigen Sie eine ESS Unterzeichnung-Zertifikat (RFC 2634 section 5.4) oder ESS verwenden signing-certificate-v2 (RFC 5035 section 3) signiertes Attribut zum Referenzieren des Unterzeichnerzertifikats.

In diesen Attributen ist daher die Zuordnung der Signatur zu ihrem Signaturzertifikat festgelegt , bevor der Signaturwert generiert wird.

Sie können also ein Signaturzertifikat nicht frei einer bereits generierten Signatur zuordnen.

Verwandte Themen