iText: generación de hash de PDF sin cadena de certificados

Estoy tratando de construir una aplicación donde sucede lo siguiente:

Un cliente solicita un hash PDF del servidor.El servidor genera el hash de un archivo PDF y lo envía al cliente.El cliente firma este hash con su clave privada y envía el hash firmado junto con la parte pública de su propio certificado.El servidor genera un nuevo archivo PDF firmado.

El problema que tengo con esto: parece imposible que el servidor genere un hash a firmar sin tener el certificado del cliente disponible de antemano. Realmente preferiría crear una solución donde el servidor no necesita conocer el certificado del cliente para crear el resumen del documento.

Todos los ejemplos que he encontrado hasta ahora usan la función PdfPKCS7.getAuthenticatedAttributeBytes para obtener el hash a firmar, pero esto requiere un certificado de cliente para ser conocido. He visto el documento técnico "Firmas digitales para documentos PDF" de Bruno Lowagie, pero no he podido ver exactamente qué información se digiere.

Aquí hay un fragmento de código de mi intento actual:

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);

}

Desafortunadamente, este hash no parece ser correcto, firmar este hash y generar un documento firmado basado en el hash firmado conduce a una firma no válida.

Estaría muy agradecido si alguien me puede ayudar a mejorar este fragmento de código, o de lo contrario me dará una idea de los datos que necesito asimilar para una firma.

Respuestas a la pregunta(1)

Su respuesta a la pregunta