ctt-gob-es / clienteafirma

Cliente @firma
http://administracionelectronica.gob.es/ctt/clienteafirma
248 stars 120 forks source link

Firma lotes NO deja "validación mecánica" (la firma simple sí) #300

Open sanmolhec opened 1 year ago

sanmolhec commented 1 year ago

Hola.

Al realizar una firma por lotes de varios ficheros PDF (o uno único), no somos capaces de que deje la marca de la "validación mecánica" de la firma.

En la firma simple (con autofirma 1.7.2) y también en la firma de lotes anteriormente (v2.1 del trifase y v1.5 de autofirma), conseguimos meter la firma en la hoja y posición que queremos, con el tipo de letra, color y demás opciones que configuramos.

Sin embargo, en la firma por lotes (v2.21 del triphase y v1.7.2 de autofirma), sólo nos deja la validación cuando usamos un campo de firma electrónica en el pdf y sin opciones, por defecto. Si intentamos meter texto configurado o cambiar las opciones no funciona. Al intentarlo con pdf's sin campo de firma tampoco hay forma de que deje la validación.

Una configuración de extraparams con la que probamos es esta:

\layer2Text=Firmado por $$SUBJECTCN$$ el $$SIGNDATE=dd/MM/yyyy (HH:mm:ss)$$\nlayer2FontFamily=1\nlayer2FontSize=8\nlayer2FontStyle=2\nlayer2FontColor=gray\nsignaturePage=-1\nsignaturePositionOnPageLowerLeftX=45\nsignaturePositionOnPageLowerLeftY=80\nsignaturePositionOnPageUpperRightX=560\nsignaturePositionOnPageUpperRightY=140

que luego convertimos a array de bytes en base64.

Con eso en la firma simple firmamos en la última página, en gris con Helvética 8 en cursiva, con el texto dato y en la posición marcada. Pero en los lotes "pasa" de la configuración y no deja la huella en el "papel".

otra de las configuraciones con las que probamos ha sido:

\layer2Text=Firmado por $$SUBJECTCN$$ el $$SIGNDATE=dd/MM/yyyy (HH:mm:ss)$$\nlayer2FontFamily=1\nlayer2FontSize=6\nlayer2FontStyle=2\nlayer2FontColor=red\nsignatureField=FirmaDigital

que si es firma simple funciona, pero si está en un lote no.

¿A alguien más le pasa? ¿Lo ha podido solucionar?

¿Alguna idea de cuál puede ser el error? ¿qué estamos haciendo mal?

Gracias.

sanmolhec commented 1 year ago

Hemos probado a cambiar el orden de los extraparams, poniendo el primero el campo de firma, por si fuese eso (ya que en los lotes si pasamos sólo el campo de firma sin otros parámetros funciona), usando estas configuraciones:

\signatureField=FirmaDigital\nlayer2Text=Firmado por $$SUBJECTCN$$ el $$SIGNDATE=dd/MM/yyyy (HH:mm:ss)$$\nlayer2FontFamily=1\nlayer2FontSize=6\nlayer2FontStyle=2\nlayer2FontColor=red

\signatureField=FirmaDigital\nlayer2Text=Firmado por $$SUBJECTCN$$ el $$SIGNDATE=dd/MM/yyyy (HH:mm:ss)$$

pero tampoco van.

En los lotes sólo funciona (deja validación impresa de la firma) cuando firmas en un pdf con campo de firma digital y sólo indicas el campo sin darle más opciones, así:

signatureField=FirmaDigital

Resumiendo comportamientos:

Firma simple ->

Firma lote (uno o varios ficheros) ->

¿Ideas?

Gracias

Gamuci commented 1 year ago

Hola @sanmolhec:

Acabo de hacer una prueba con la última versión de código del servidor trifásico y me ha funcionado. O se trata de un error en la versión que tienes o es un problema a la hora de enviar los parámetros de configuración:

Para ver si es un problema del servidor trifásico, intenta hacer una firma simple trifásica (establece como formato "PAdEStri" e incluye el parámetro extra "serverUrl" con la URL del servicio de firma trifásica) y los mismos parámetros que utilizas en la firma de lotes. La firma de lotes es trifásica, así que el comportamiento debería ser el mismo. Si la firma trifásica usa la configuración que le pasas, el problema está en el paso de la configuración en el lote. Si no la usa, el problema es de la versión del servidor trifásico que tienes.

Te dejo aquí el XML del lote que he utilizado en la prueba:

<?xml version="1.0" encoding="UTF-8"?>
<signbatch stoponerror="false" algorithm="SHA256withRSA">
    <singlesign Id="1e5112c0-cba4-4c91-98b6-f288048b8c9f">
        <datasource>http://appprueba:8080/afirma-ui-miniapplet-deploy/1.pdf</datasource>
        <format>PAdES</format>
        <suboperation>sign</suboperation>
        <extraparams>bGF5ZXIyVGV4dD1GaXJtYWRvIHBvciAkJFNVQkpFQ1RDTiQkIGVsICQkU0lHTkRBVEU9ZGQvTU0veXl5eSAoSEg6bW06c3MpJCQKbGF5ZXIyRm9udEZhbWlseT0xCmxheWVyMkZvbnRTaXplPTgKbGF5ZXIyRm9udFN0eWxlPTIKbGF5ZXIyRm9udENvbG9yPWdyYXkKc2lnbmF0dXJlUGFnZT0tMQpzaWduYXR1cmVQb3NpdGlvbk9uUGFnZUxvd2VyTGVmdFg9NDUKc2lnbmF0dXJlUG9zaXRpb25PblBhZ2VMb3dlckxlZnRZPTgwCnNpZ25hdHVyZVBvc2l0aW9uT25QYWdlVXBwZXJSaWdodFg9NTYwCnNpZ25hdHVyZVBvc2l0aW9uT25QYWdlVXBwZXJSaWdodFk9MTQwCg==</extraparams>
        <signsaver>
            <class>es.gob.afirma.signers.batch.SignSaverFile</class>
            <config>RmlsZU5hbWU9QzovVXNlcnMvY2FybG9zLmdhbXVjaS9EZXNrdG9wL3NhbGlkYS90cmkvMV94bWwucGRm</config>
        </signsaver>
    </singlesign>
    <singlesign Id="e4e9f2b4-298d-4ddb-9370-ae3d906c31a9">
        <datasource>http://appprueba:8080/afirma-ui-miniapplet-deploy/2.pdf</datasource>
        <format>PAdES</format>
        <suboperation>sign</suboperation>
        <extraparams>bGF5ZXIyVGV4dD1GaXJtYWRvIHBvciAkJFNVQkpFQ1RDTiQkIGVsICQkU0lHTkRBVEU9ZGQvTU0veXl5eSAoSEg6bW06c3MpJCQKbGF5ZXIyRm9udEZhbWlseT0xCmxheWVyMkZvbnRTaXplPTgKbGF5ZXIyRm9udFN0eWxlPTIKbGF5ZXIyRm9udENvbG9yPWdyYXkKc2lnbmF0dXJlUGFnZT0tMQpzaWduYXR1cmVQb3NpdGlvbk9uUGFnZUxvd2VyTGVmdFg9NDUKc2lnbmF0dXJlUG9zaXRpb25PblBhZ2VMb3dlckxlZnRZPTgwCnNpZ25hdHVyZVBvc2l0aW9uT25QYWdlVXBwZXJSaWdodFg9NTYwCnNpZ25hdHVyZVBvc2l0aW9uT25QYWdlVXBwZXJSaWdodFk9MTQwCg==</extraparams>
        <signsaver>
            <class>es.gob.afirma.signers.batch.SignSaverFile</class>
            <config>RmlsZU5hbWU9QzovVXNlcnMvY2FybG9zLmdhbXVjaS9EZXNrdG9wL3NhbGlkYS90cmkvMl94bWwucGRm</config>
        </signsaver>
    </singlesign>
</signbatch>

Cambia las URL de los PDF en los nodos "datasource" y la ruta local de las firmas de salida de los nodos "config" (codificadas en base 64) y trata de generar la firma del lote. Si funciona es que había algún problema en cómo indicabas los "extraparams" al construir el lote.

sanmolhec commented 1 year ago

Hola Carlos. Perdón por la tardanza en contestar, hemos estado de pruebas y con mucho lío.

Sobre lo que nos comentas @Gamuci, hemos hecho múltiples pruebas con buen resultado pero seguimos sin dar con la tecla de la configuración adecuada en nuestra aplicación.

1) Probando tu lote desde un html simple (usando el mismo js que en nuestra aplicación) contra nuestro triphase (cambiando ruta de fichero origen y ruta de guardado) guarda y deja impresión de la firma. Además de dejar log en el trifase. Parece que el triphase está ok y nuestra config del extraparams mal.

2) Guardando un fichero simple a través del trifase, configurando el parámetro serverUrl (con la ruta de nuestro triphase) y fijando el formato de firma a PAdEStri, también se guarda el fichero y deja la validación mecánica, pero no deja huella en el log del triphase (así que no sabemos realmente si pasará por él o está haciendo un guardado simple "normal"). Usamos triphase 2.21 y autofirma 1.7.2.

Lo que parece claro es que es la configuración del extraparams que tenemos es errónea, pero con relación a lo que le mandamos nosotros, la única diferencia que vemos más obvia es que nuestros saltos de línea se codifican con \n y en el que nos pasas tú no. ¿Ha cambiado esto para los lotes o en general? ¿no hay que meter ese \n? ¿Hay que codificar a base64 de alguna forma específica?

Muchas gracias y sentimos dar tanto la lata.

sanmolhec commented 1 year ago

Hola, sin despejar la duda de si al usar el PAdEStri está pasando realmente o no por el triphase, así que no podemos probarlo del todo correctamente o tener claro si la solución es la adecuada al 100%, pero hemos visto algo:

Si configuramos el lote con saltos de línea del sistema en lugar de \n dentro del extraparams, vuelve a dejar la impresión de firma o "validación mecánica de la firma" en el documento usando el trifase.

Este comportamiento en versiones anteriores del trifase parecía no ser así, o al menos con el mismo código configurábamos igual las firmas simples que las de los lotes y dejaba esa marca.

Hemos visto que en el manual hay una nota al respecto:

Según el modo en el que obtenga el Base64, es posible que deba utilizar como representación visible del retorno de carro la partícula \n.

Dejamos este hilo por si le puede servir de ayuda a más gente, y de paso para intentar despejar esta duda de los saltos de línea entre los extraparams y saber cómo se usa el triphase desde la firma simple con el tipo de firma PAdEStri .

Gracias.

sgregori commented 1 year ago

Hola compañeros, Yo llevo unos dias rompiéndome la cabeza con ésto, y no hay manera. En algún momento he visto que escribía algo en el documento, pero no se porqué ni porque deja de hacerlo. Me falla al hacerlo por lotes con triphase.

sgregori commented 1 year ago

Finalmente lo he logrado con estos params:

layer2Text = Firmado por $$SUBJECTCN$$ el día $$SIGNDATE=dd/MM/yyyy$$ con certificado emitido por $$ISSUERCN$$ layer2FontSize = 15 includeQuestionMark = 1 signaturePositionOnPageLowerLeftX = 43 signaturePositionOnPageLowerLeftY = 43 signaturePositionOnPageUpperRightX = 500 signaturePositionOnPageUpperRightY = 500 signaturePage = 1 layer2FontColor = red headless = false obfuscateCertText = false compressPdf = 1 pdfVersion = 7 includeOnlySignningCertificate = false