iText - Generieren von PDF-Hash ohne Zertifikatskette

Ich versuche, eine Anwendung zu erstellen, in der Folgendes passiert:

Ein Client fordert einen PDF-Hash vom Server an.Der Server generiert den Hash einer PDF-Datei und sendet diesen an den Client.Der Client signiert diesen Hash mit seinem privaten Schlüssel und sendet den signierten Hash zusammen mit dem öffentlichen Teil seines eigenen Zertifikats.Der Server generiert eine neue, signierte PDF-Datei.

Das Problem, das ich damit habe: Es scheint unmöglich für den Server, einen zu signierenden Hash zu generieren, ohne vorher das Zertifikat des Clients verfügbar zu haben. Ich würde es wirklich vorziehen, eine Lösung zu erstellen, bei der der Server das Zertifikat des Clients nicht kennen muss, um den Dokumentauszug zu erstellen.

Alle Beispiele, die ich bisher gefunden habe, verwenden die PdfPKCS7.getAuthenticatedAttributeBytes-Funktion, um den zu signierenden Hash abzurufen. Hierzu muss jedoch ein Client-Zertifikat bekannt sein. Ich habe mir das Whitepaper "Digitale Signaturen für PDF-Dokumente" von Bruno Lowagie angesehen, aber nicht genau gesehen, welche Informationen verdaut werden.

Hier ist ein Codeausschnitt meines aktuellen Versuchs:

public byte[] simplePresign(String src, String digestAlgorithm) throws IOException, DocumentException, GeneralSecurityException {
    this.digestAlgorithm = digestAlgorithm;
    tsaClient = new CustomTSAClient();

    PdfReader reader = new PdfReader(src);
    os = new ByteArrayOutputStream();
    PdfAStamper stamper = PdfAStamper.createSignature(reader, os, '\0', PdfAConformanceLevel.PDF_A_1B);
    appearance = stamper.getSignatureAppearance();

    PdfSignature dic = new PdfSignature(PdfName.ADOBE_PPKLITE, PdfName.ADBE_PKCS7_DETACHED);
    appearance.setCryptoDictionary(dic);

    HashMap<PdfName, Integer> exc = new HashMap<PdfName, Integer>();
    exc.put(PdfName.CONTENTS, getEstimatedSize(null, tsaClient) * 2 + 2);
    appearance.preClose(exc);

    InputStream data = appearance.getRangeStream();
    MessageDigest mDigest = DigestAlgorithms.getMessageDigest(digestAlgorithm, null);

    return DigestAlgorithms.digest(data, mDigest);

}

Dieser Hash scheint leider nicht korrekt zu sein. Das Signieren dieses Hashs und das Generieren eines signierten Dokuments basierend auf dem signierten Hash führt zu einer ungültigen Signatur.

Ich wäre sehr dankbar, wenn mir jemand helfen könnte, diesen Codeausschnitt zu verbessern oder mir auf andere Weise einen Einblick in die Daten zu geben, die ich für eine Signatur verarbeiten muss.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage