ctt-gob-es / clienteafirma

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

Firma Lotes no funciona. Como desplegar el triphase #293

Open sanmolhec opened 1 year ago

sanmolhec commented 1 year ago

Hola. Tenemos una aplicación que realiza firma simple y relizaba (en su día -2017-, autofirma-miniapplet 1.5 y triphase 2.5) firma por lotes. Sólo se ha ido manteniendo y usado la firma simple hasta ahora.

Nos han pedido retomar la firma por lotes, estamos actualizados a autofirma-autoscrip 1.7, pero no tenemos forma de firmar lotes.

Ni con el antiguo triphase 2.5 (con el autoscript 1.7) ni desplegando el nuevo triphase-signer 2.21.

Los lotes parecen bien generados (no vemos diferencias en cómo generarlos de antes a ahora) y el problema parece que es de comunicación con el triphase o despliegue del propio triphase.

Obtenemos errores: SAF_20 "Error en el proceso local del lote de firma" si no encuentra el tomcat (poniendo dirección una errónea o parando el servidor tomcat del servidor), o SAF_26 "Error comunicación servicio firma lotes" cuando el tomcat está funcionando (pero independientemente de tener desplegada o no el triphase).

¿¿Parece un error en una llamada inicial al presigner del trifase?? o bien que no estamos desplegando adecuadamente el triphase.

Aparte del manual del integrador v1.7.0 que hemos seguido pero sin éxito hasta ahora, hay en algún otro sitio con más información sobre cómo hay que desplegar el triphase (y los retriever y storage), cómo han de configurarse las propiedades tras desplegarlos, nombre de los servicios/métodos a los que llamar y cómo (parametros entrada/salida)...

Por ejemplo, el war del triphase 2.21 se llama: "afirma-server-triphase-signer-2.21.war" hay que deplegarlo tal cual y llamar a .../afirma-server-triphase-signer-2.21/... o bien llamar a .../afirma-server-triphase-signer/... como antes. O bien hay que renombrarlo antes de desplegarlo a "afirma-server-triphase-signer.war" y llamar a .../afirma-server-triphase-signer/...

Muchas gracias.

Gamuci commented 1 year ago

Hola @sanmolhec ,

¿Estás probando en un entorno con SSL? AutoFirma comprueba por defecto la confianza del certificado SSL de los servicios con los que se conecta. Si estás haciendo ahora la integración posiblemente estés probando en un entorno de pruebas con un certificado que no sea de confianza para Java, por lo que AutoFirma rechazaría la conexión con el servidor trifásico. Si se da el caso, abre AutoFirma, accede al diálogo de "Preferencias" y, en la pestaña "General", desactiva la opción "Aceptar sólo conexiones con sitios seguros".

Si no fue eso, consulta el log de AutoFirma a ver si te da más información. En Windows lo puedes encontrar en: C:\Users\USUARIO.afirma\AUTOFIRMA.afirma.log.xml (USUARIO sería tu nombre de usuario). Te en cuenta que este sólo almacena el log de la última ejecución, así que sería hacer la prueba y consultarlo.

Sobre lo del nombre del WAR, puedes cambiarlo y ponerle el nombre que quieras. Mi consejo es que le quites el número de versión. Lo que si tienes que tener en cuenta es que a menudo hay cambios en este WAR y, aunque se mantiene la compatibilidad, las nuevas versiones pueden requerir nuevas propiedades en el fichero de configuración, así que revisa ese fichero.

Un saludo,

sanmolhec commented 1 year ago

Hola. Muchas gracias por la respuesta porque ya no sabemos qué más probar.

Estamos en un entorno de pruebas pero tenemos deshabilitada la opción de autofirma de sólo confiar en dominios seguros.

El war hemos probado a desplegarlo de varias formas y con varias configuraciones, al final está renombrado sin la versión.

La aplicación monta los lotes dinámicamente pero ya no la estamos usando para las purebas, sino que estamos haciendo llamadas JS lo más simples posibles, con sólo 1 fichero de lote.

Si usamos el guardado simple contra el StorageServer (recuperando del directorio de entrada y guardando en el de salida funciona), pero al usar el Triphase para guardar el lote no va: SAF 26.

Hemos dado permisos de guardado en los directorios de entrada/salida/temporales varios/lotes de lectura escritura a todos los usuariios de la máquina.

Los dicumentos a firmar son accesibles desde http o https://MiServidorLocal/...

Estamos usando autoscript 1.7, con autofirma 1.7.2 y el trifase 2.21.

El código JS de prueba es este:

function enviarLote() {

    var lote = "..."; //codificado en Base64

    try {

        AutoScript.setStickySignatory(true);

        AutoScript.signBatch(
            lote,
            "http://MiServidorLocal:8080/afirma-server-triphase-signer/BatchPresigner",
            "http://MiServidorLocal:8080/afirma-server-triphase-signer/BatchPostsigner",
            "serverUrl=http://MiServidorLocal:8080/afirma-server-triphase-signer/SignatureService",
            successCallback,
            errorCallback);
    } catch (e) {
        try {
            console.log("Type: " + AutoScript.getErrorType() + "\nMessage: " + AutoScript.getErrorMessage());
        } catch (ex) {
            console.log("Error: " + e);
        }
    }
}

El lote lo estamos montando así:

<?xml version="1.0" encoding="UTF-8" ?>
<signbatch stoponerror="false" algorithm="SHA256withRSA" concurrenttimeout="30">
<singlesign Id="7725374e">
<datasource>https://MiServidorLocal/Firma/InfOrdenComisionServicio1.pdf</datasource>
<format>PAdES</format>
<suboperation>sign</suboperation>
<extraparams />
<signsaver>
<class>es.gob.afirma.signers.batch.SignSaverFile</class>
<config>
RmlsZU5hbWU9QzpcXERvY0Zpcm1hZG9zXFxMb3Rlc1xcTG90ZV8xMzMxNDQzOTU2NjM3OTM1NzBfMS5wZGY=
</config>
</signsaver>
</singlesign>
</signbatch>

o bien usando la clase con guardado a disco que desarrollamos: es.gob.afirma.signers.batch.SalvarFicheroFirmado y cambiando en la configuración la ruta de guardado a estas: FileName=C:\DocFirmados\Lotes\Lote_133144395663793570_1.pdf o FileName=C:/DocFirmados/Lotes/Lote_133144395663793570_1.pdf (ya que estamos en entorno windows, tenemos un IIS donde estará la aplicación y el Apache-tomcat del triphase)

La configuración del trifase es:

# signbatch_config

concurrentmode=false
concurrenttimeout=3000
maxcurrentsigns=100
tmpdir=C:/DocFirmados/Lotes/temp_lotes
allowedsources=base64;file://*;http://*;https://*

# tps_config

Access-Control-Allow-Origin=*
# Clase del gestor de documentos a utilizar (debe implementar DocumentManager)
#document.manager=es.gob.afirma.triphase.server.document.SelfishDocumentManager
document.manager=es.gob.afirma.triphase.server.document.FileSystemDocumentManager
#document.manager=es.gob.afirma.triphase.server.document.LegacyBatchDocumentManager 
verification.key=
cacheEnabled=true
document.cache.manager=es.gob.afirma.triphase.server.cache.FileSystemCacheManager
tmpdir=C:/DocFirmados/Lotes/temp_lotes
concurrent.enable=false
concurrent.timeout=3000
concurrent.maxsigns=10
docmanager.filesystem.indir=C:/DocFirmados/Lotes/entrada
docmanager.filesystem.outdir=C:/DocFirmados/Lotes/salida
docmanager.filesystem.overwrite=true
docmanager.legacybatch.allowedsources=base64;http://*;https://*;file:/
cache.tmpDir=C:/DocFirmados/Lotes/tmp
cache.expTime=60000
cache.maxUseToCleaning=300

Los log's del autofirma son poco aclaratorios (o no los entendemos):

<record>
  <date>2022-12-02T12:48:43.618474700Z</date>
  <millis>1669985323618</millis>
  <nanos>474700</nanos>
  <sequence>38</sequence>
  <logger>es.gob.afirma</logger>
  <level>WARNING</level>
  <class>es.gob.afirma.signers.batch.client.BatchSigner</class>
  <method>sign</method>
  <thread>29</thread>
  <message>El servicio de firma devolvio un  error durante la prefirma: null</message>
</record>
<record>
  <date>2022-12-02T12:48:43.619475700Z</date>
  <millis>1669985323619</millis>
  <nanos>475700</nanos>
  <sequence>39</sequence>
  <logger>es.gob.afirma</logger>
  <level>SEVERE</level>
  <class>es.gob.afirma.standalone.protocol.ProtocolInvocationLauncherBatch</class>
  <method>processBatch</method>
  <thread>29</thread>
  <message>Error en el servicio de firma de lotes. StatusCode: 500. Descripcion: null</message>
</record>
<record>
  <date>2022-12-02T12:48:45.701666300Z</date>
  <millis>1669985325701</millis>
  <nanos>666300</nanos>
  <sequence>40</sequence>
  <logger>es.gob.afirma</logger>
  <level>SEVERE</level>
  <class>es.gob.afirma.standalone.protocol.ProtocolInvocationLauncherErrorManager</class>
  <method>showError</method>
  <thread>29</thread>
  <message>Ha ocurrido un error realizando la operación.
(SAF_26: Error en la comunicación con el servicio de firma de lotes.)</message>
</record>
<record>
  <date>2022-12-02T13:54:01.084543700Z</date>
  <millis>1669989241084</millis>
  <nanos>543700</nanos>
  <sequence>41</sequence>
  <logger>es.gob.afirma</logger>
  <level>INFO</level>
  <class>es.gob.afirma.standalone.protocol.AfirmaWebSocketServer</class>
  <method>onClose</method>
  <thread>46</thread>
  <message>Se ha cerrado la comunicacion con el socket. Cerramos la aplicacion</message>
</record>

Aquí los log's recuperados del JS, con las funciones AutoScript.getErrorType() y AutoScript.getErrorMessage():

<record>
  <date>2022-11-29T14:32:21.880418400Z</date>
  <millis>1669732341880</millis>
  <nanos>418400</nanos>
  <sequence>38</sequence>
  <logger>es.gob.afirma</logger>
  <level>WARNING</level>
  <class>es.gob.afirma.signers.batch.client.BatchSigner</class>
  <method>sign</method>
  <thread>28</thread>
  <message>El servicio de firma devolvio un  error durante la prefirma: null</message>
</record>
<record>
  <date>2022-11-29T14:32:21.881419500Z</date>
  <millis>1669732341881</millis>
  <nanos>419500</nanos>
  <sequence>39</sequence>
  <logger>es.gob.afirma</logger>
  <level>SEVERE</level>
  <class>es.gob.afirma.standalone.protocol.ProtocolInvocationLauncherBatch</class>
  <method>processBatch</method>
  <thread>28</thread>
  <message>Error en el servicio de firma de lotes. StatusCode: 500. Descripcion: null</message>
</record>
<record>
  <date>2022-11-29T14:32:24.397626900Z</date>
  <millis>1669732344397</millis>
  <nanos>626900</nanos>
  <sequence>40</sequence>
  <logger>es.gob.afirma</logger>
  <level>SEVERE</level>
  <class>es.gob.afirma.standalone.protocol.ProtocolInvocationLauncherErrorManager</class>
  <method>showError</method>
  <thread>28</thread>
  <message>Ha ocurrido un error realizando la operación.
(SAF_26: Error en la comunicación con el servicio de firma de lotes.)</message>
</record>

y los log's del apache-tomcat de algunas llamadas: localhost-access

26.16.43.55 - - [02/Dec/2022:12:46:13 +0100] "POST /afirma-server-triphase-signer/BatchPresigner HTTP/1.1" 500 2614
10.31.207.148 - - [02/Dec/2022:12:46:40 +0100] "POST /afirma-server-triphase-signer/BatchPresigner HTTP/1.1" 500 2614
10.31.207.148 - - [02/Dec/2022:12:48:06 +0100] "POST /afirma-server-triphase-signer/BatchPresigner HTTP/1.1" 500 2614

catalina de múltiples intentos

02-Dec-2022 08:28:03.164 ADVERTENCIA [http-nio-8080-exec-20] es.gob.afirma.signers.batch.xml.SignBatchSerial.doPreBatch Error en una de las firmas del lote (id1), se continua con el siguiente elemento: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.ssl.Alert.createSSLException(Unknown Source)
        at sun.security.ssl.TransportContext.fatal(Unknown Source)
        at sun.security.ssl.TransportContext.fatal(Unknown Source)
        at sun.security.ssl.TransportContext.fatal(Unknown Source)
        at sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(Unknown Source)
        at sun.security.ssl.CertificateMessage$T13CertificateConsumer.onConsumeCertificate(Unknown Source)
        at sun.security.ssl.CertificateMessage$T13CertificateConsumer.consume(Unknown Source)
        at sun.security.ssl.SSLHandshake.consume(Unknown Source)
        at sun.security.ssl.HandshakeContext.dispatch(Unknown Source)
        at sun.security.ssl.HandshakeContext.dispatch(Unknown Source)
        at sun.security.ssl.TransportContext.dispatch(Unknown Source)
        at sun.security.ssl.SSLTransport.decode(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.decode(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)
        at es.gob.afirma.core.misc.http.UrlHttpManagerImpl.readUrl(UrlHttpManagerImpl.java:253)
        at es.gob.afirma.core.misc.http.UrlHttpManagerImpl.readUrl(UrlHttpManagerImpl.java:125)
        at es.gob.afirma.core.misc.http.UrlHttpManagerImpl.readUrl(UrlHttpManagerImpl.java:96)
        at es.gob.afirma.core.misc.http.DataDownloader.downloadData(DataDownloader.java:84)
        at es.gob.afirma.signers.batch.xml.SingleSign.getData(SingleSign.java:406)
        at es.gob.afirma.signers.batch.xml.SingleSignPreProcessor.getPreSign(SingleSignPreProcessor.java:72)
        at es.gob.afirma.signers.batch.xml.SingleSignPreProcessor.doPreProcess(SingleSignPreProcessor.java:51)
        at es.gob.afirma.signers.batch.xml.SingleSign.doPreProcess(SingleSign.java:285)
        at es.gob.afirma.signers.batch.xml.SignBatchSerial.doPreBatch(SignBatchSerial.java:58)
        at es.gob.afirma.signers.batch.server.BatchPresigner.service(BatchPresigner.java:116)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:779)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Unknown Source)
    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
        at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
        at sun.security.validator.Validator.validate(Unknown Source)
        at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
        ... 48 more
    Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown Source)
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
        at java.security.cert.CertPathBuilder.build(Unknown Source)
        ... 54 more
02-Dec-2022 08:43:27.687 ADVERTENCIA [http-nio-8080-exec-12] es.gob.afirma.signers.batch.xml.SignBatchSerial.doPreBatch Error en una de las firmas del lote (id1), se continua con el siguiente elemento: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.ssl.Alert.createSSLException(Unknown Source)
        at sun.security.ssl.TransportContext.fatal(Unknown Source)
        at sun.security.ssl.TransportContext.fatal(Unknown Source)
        at sun.security.ssl.TransportContext.fatal(Unknown Source)
        at sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(Unknown Source)
        at sun.security.ssl.CertificateMessage$T13CertificateConsumer.onConsumeCertificate(Unknown Source)
        at sun.security.ssl.CertificateMessage$T13CertificateConsumer.consume(Unknown Source)
        at sun.security.ssl.SSLHandshake.consume(Unknown Source)
        at sun.security.ssl.HandshakeContext.dispatch(Unknown Source)
        at sun.security.ssl.HandshakeContext.dispatch(Unknown Source)
        at sun.security.ssl.TransportContext.dispatch(Unknown Source)
        at sun.security.ssl.SSLTransport.decode(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.decode(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)
        at es.gob.afirma.core.misc.http.UrlHttpManagerImpl.readUrl(UrlHttpManagerImpl.java:253)
        at es.gob.afirma.core.misc.http.UrlHttpManagerImpl.readUrl(UrlHttpManagerImpl.java:125)
        at es.gob.afirma.core.misc.http.UrlHttpManagerImpl.readUrl(UrlHttpManagerImpl.java:96)
        at es.gob.afirma.core.misc.http.DataDownloader.downloadData(DataDownloader.java:84)
        at es.gob.afirma.signers.batch.xml.SingleSign.getData(SingleSign.java:406)
        at es.gob.afirma.signers.batch.xml.SingleSignPreProcessor.getPreSign(SingleSignPreProcessor.java:72)
        at es.gob.afirma.signers.batch.xml.SingleSignPreProcessor.doPreProcess(SingleSignPreProcessor.java:51)
        at es.gob.afirma.signers.batch.xml.SingleSign.doPreProcess(SingleSign.java:285)
        at es.gob.afirma.signers.batch.xml.SignBatchSerial.doPreBatch(SignBatchSerial.java:58)
        at es.gob.afirma.signers.batch.server.BatchPresigner.service(BatchPresigner.java:116)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:779)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Unknown Source)
    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
        at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
        at sun.security.validator.Validator.validate(Unknown Source)
        at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
        ... 48 more
    Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown Source)
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
        at java.security.cert.CertPathBuilder.build(Unknown Source)
        ... 54 more
02-Dec-2022 09:43:08.869 INFORMACIÓN [http-nio-8080-exec-23] es.gob.afirma.triphase.server.ConfigManager.loadConfigFile Se cargara el fichero de configuracion tps_config.properties
02-Dec-2022 09:43:08.880 INFORMACIÓN [http-nio-8080-exec-23] es.gob.afirma.triphase.server.ConfigManager.loadConfigFile Se cargara el fichero de configuracion tps_config.properties desde el CLASSPATH
02-Dec-2022 09:44:44.121 ADVERTENCIA [http-nio-8080-exec-25] es.gob.afirma.signers.batch.xml.SignBatchSerial.doPreBatch Error en una de las firmas del lote (id1), se continua con el siguiente elemento: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.ssl.Alert.createSSLException(Unknown Source)
        at sun.security.ssl.TransportContext.fatal(Unknown Source)
        at sun.security.ssl.TransportContext.fatal(Unknown Source)
        at sun.security.ssl.TransportContext.fatal(Unknown Source)
        at sun.security.ssl.CertificateMessage$T13CertificateConsumer.checkServerCerts(Unknown Source)
        at sun.security.ssl.CertificateMessage$T13CertificateConsumer.onConsumeCertificate(Unknown Source)
        at sun.security.ssl.CertificateMessage$T13CertificateConsumer.consume(Unknown Source)
        at sun.security.ssl.SSLHandshake.consume(Unknown Source)
        at sun.security.ssl.HandshakeContext.dispatch(Unknown Source)
        at sun.security.ssl.HandshakeContext.dispatch(Unknown Source)
        at sun.security.ssl.TransportContext.dispatch(Unknown Source)
        at sun.security.ssl.SSLTransport.decode(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.decode(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(Unknown Source)
        at es.gob.afirma.core.misc.http.UrlHttpManagerImpl.readUrl(UrlHttpManagerImpl.java:253)
        at es.gob.afirma.core.misc.http.UrlHttpManagerImpl.readUrl(UrlHttpManagerImpl.java:125)
        at es.gob.afirma.core.misc.http.UrlHttpManagerImpl.readUrl(UrlHttpManagerImpl.java:96)
        at es.gob.afirma.core.misc.http.DataDownloader.downloadData(DataDownloader.java:84)
        at es.gob.afirma.signers.batch.xml.SingleSign.getData(SingleSign.java:406)
        at es.gob.afirma.signers.batch.xml.SingleSignPreProcessor.getPreSign(SingleSignPreProcessor.java:72)
        at es.gob.afirma.signers.batch.xml.SingleSignPreProcessor.doPreProcess(SingleSignPreProcessor.java:51)
        at es.gob.afirma.signers.batch.xml.SingleSign.doPreProcess(SingleSign.java:285)
        at es.gob.afirma.signers.batch.xml.SignBatchSerial.doPreBatch(SignBatchSerial.java:58)
        at es.gob.afirma.signers.batch.server.BatchPresigner.service(BatchPresigner.java:116)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:779)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Unknown Source)
    Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(Unknown Source)
        at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
        at sun.security.validator.Validator.validate(Unknown Source)
        at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)
        at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)
        at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
        ... 48 more
    Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.build(Unknown Source)
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
        at java.security.cert.CertPathBuilder.build(Unknown Source)
        ... 54 more

Ejemplo de cuando hacemos una llamada desde JS de firma simple usando el servidor intermedio:

Log del catalina

02-Dec-2022 08:51:59.585 INFORMACIÓN [http-nio-8080-exec-14] es.gob.afirma.triphase.server.SignatureService.service == INICIO FIRMA TRIFASICA ==
02-Dec-2022 08:51:59.585 INFORMACIÓN [http-nio-8080-exec-14] es.gob.afirma.triphase.server.SignatureService.service Formato de firma seleccionado: pades
02-Dec-2022 08:51:59.587 INFORMACIÓN [http-nio-8080-exec-14] es.gob.afirma.triphase.server.SignatureService.service Recuperamos el documento mediante el DocumentManager
02-Dec-2022 08:51:59.587 INFORMACIÓN [http-nio-8080-exec-14] es.gob.afirma.triphase.server.document.FileSystemDocumentManager.getDocument Recuperamos el documento con referencia: cHJ1ZWJhLnBkZg==
02-Dec-2022 08:51:59.588 INFORMACIÓN [http-nio-8080-exec-14] es.gob.afirma.triphase.server.document.FileSystemDocumentManager.getDocument Buscamos el fichero: C:\DocFirmados\Lotes\entrada\prueba.pdf
02-Dec-2022 08:51:59.615 INFORMACIÓN [http-nio-8080-exec-14] es.gob.afirma.triphase.server.SignatureService.service Recuperado documento de 270765 octetos
02-Dec-2022 08:51:59.620 INFORMACIÓN [http-nio-8080-exec-14] es.gob.afirma.triphase.server.SignatureService.service  == PREFIRMA en servidor
02-Dec-2022 08:51:59.622 INFORMACIÓN [http-nio-8080-exec-14] es.gob.afirma.triphase.signer.processors.PAdESTriPhasePreProcessor.preProcessPreSign Prefirma PAdES - Firma - INICIO
02-Dec-2022 08:51:59.623 INFORMACIÓN [http-nio-8080-exec-14] es.gob.afirma.triphase.signer.processors.PAdESTriPhasePreProcessor.preProcessPreSign Se invocan las funciones internas de prefirma PAdES
02-Dec-2022 08:51:59.680 INFORMACIÓN [http-nio-8080-exec-14] es.gob.afirma.triphase.signer.processors.PAdESTriPhasePreProcessor.preProcessPreSign Se prepara la respuesta de la prefirma PAdES
02-Dec-2022 08:51:59.680 INFORMACIÓN [http-nio-8080-exec-14] es.gob.afirma.triphase.signer.processors.PAdESTriPhasePreProcessor.preProcessPreSign Prefirma PAdES - Firma - FIN
02-Dec-2022 08:51:59.681 INFORMACIÓN [http-nio-8080-exec-14] es.gob.afirma.triphase.server.SignatureService.service Se ha calculado el resultado de la prefirma y se devuelve
02-Dec-2022 08:51:59.686 INFORMACIÓN [http-nio-8080-exec-14] es.gob.afirma.triphase.server.SignatureService.service == FIN PREFIRMA
02-Dec-2022 08:52:09.487 INFORMACIÓN [http-nio-8080-exec-15] es.gob.afirma.triphase.server.SignatureService.service == INICIO FIRMA TRIFASICA ==
02-Dec-2022 08:52:09.487 INFORMACIÓN [http-nio-8080-exec-15] es.gob.afirma.triphase.server.SignatureService.service Formato de firma seleccionado: pades
02-Dec-2022 08:52:09.488 INFORMACIÓN [http-nio-8080-exec-15] es.gob.afirma.triphase.server.SignatureService.service Recibidos los siguientes datos de sesion para 'post':
<xml>
 <firmas>
  <firma Id="caf85f7b-d58d-4fdb-a42f-cf7a17ccd6e0">
   <param n="PRE">MYIC5DAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBME8GCSqGSIb3DQEJBDFCBEAXtt0CNKpjBL4XLkfDqps4JdQ//8lTRiHJbUHBzhjSb3G/wiC4Hh3zPiCDen/Uy7eFUi+vmSE4QQ3ElkYjhHjvMIGVBgsqhkiG9w0BCRACDzGBhTCBggYKYIVUAQMBAQIBCTAhMAkGBSsOAwIaBQAEFBu66LnH+tNPn9N6/6NGwDkOlgLNMFEwTwYLKoZIhvcNAQkQBQEWQGh0dHBzOi8vc2VkZS5hZG1pbmlzdHJhY2lvbi5nb2IuZXMvcG9saXRpY2FfZGVfZmlybWFfYW5leG9fMS5wZGYwggHdBgsqhkiG9w0BCRACLzGCAcwwggHIMIG5MIG2MA0GCWCGSAFlAwQCAwUABECWNXfDPNdRiBrabjM5qMjOfklu6iqsgSQ0K1fc2qXCdeDaPk299/YoTKQSo146c0ee1zkujly2qFN9bBnhRRZvMGMwT6RNMEsxCzAJBgNVBAYTAkVTMREwDwYDVQQKDAhGTk1ULVJDTTEOMAwGA1UECwwFQ2VyZXMxGTAXBgNVBAMMEEFDIEZOTVQgVXN1YXJpb3MCEHlssMhcoj5hY1FSZwMOLiUwggEIMIH6BgorBgEEAaxmAwoBMIHrMCkGCCsGAQUFBwIBFh1odHRwOi8vd3d3LmNlcnQuZm5tdC5lcy9kcGNzLzCBvQYIKwYBBQUHAgIwgbAMga1DZXJ0aWZpY2FkbyBjdWFsaWZpY2FkbyBkZSBmaXJtYSBlbGVjdHLDs25pY2EuIFN1amV0byBhIGxhcyBjb25kaWNpb25lcyBkZSB1c28gZXhwdWVzdGFzIGVuIGxhIERQQyBkZSBsYSBGTk1ULVJDTSBjb24gTklGOiBRMjgyNjAwNC1KIChDL0pvcmdlIEp1YW4gMTA2LTI4MDA5LU1hZHJpZC1Fc3Bhw7FhKTAJBgcEAIvsQAEA</param>
   <param n="NEED_PRE">true</param>
   <param n="TIME">1669967519623</param>
   <param n="PID">Wzw3MzBmN2UzM2RiNTljYjcyNDRhMzA0YjhjZjZkNzIxOT48NDA5MDU0NDU3NTczYjg2NmZiNjdiMDllNjdmMzNkOGU+XQ==</param>
   <param n="CACHE_ID">SHMCGETAST.tmp</param>
   <param n="PK1">JB7hpEh9zbNBrqFfWFnGaQy+6vxmEV8v4f8k1wS/p4u+1sx21QIzWQkcNSienINFOJ/nH6Nhku1lCtIEUrGrPNGftzt4uUS2LEbxH/xW/l/vhWFwmCD2VNJQdn6uK+90jEB/NbZoSQnoJB7dh/ruDrCkHBdzBgKXc6qYZehgY9tEATEeY6ui1vhMwtFFPXZdP8oaREs54r7JBjoxC50MN+PWKuxk9m2Zc/acq0Gd37vpvF69oBMB8tg0SHdi7/PLsccElI1S0AUe5H4HVr0GYgCeTBt5BGjyUGqcJ2Cu4s2o5f5xfh8YodJnewlNdzlkqYlya8B9PIGYyWjt8o2ZgQ==</param>
  </firma>
 </firmas>
</xml>
02-Dec-2022 08:52:09.489 INFORMACIÓN [http-nio-8080-exec-15] es.gob.afirma.triphase.server.SignatureService.service Recuperamos el documento de cache
02-Dec-2022 08:52:09.519 INFORMACIÓN [http-nio-8080-exec-15] es.gob.afirma.triphase.server.SignatureService.service  == POSTFIRMA en servidor
02-Dec-2022 08:52:09.520 INFORMACIÓN [http-nio-8080-exec-15] es.gob.afirma.triphase.signer.processors.PAdESTriPhasePreProcessor.preProcessPostSign Postfirma PAdES - Firma - INICIO
02-Dec-2022 08:52:09.520 INFORMACIÓN [http-nio-8080-exec-15] es.gob.afirma.triphase.signer.processors.PAdESTriPhasePreProcessor.preProcessPostSign Se invocan las funciones internas de postfirma PAdES
02-Dec-2022 08:52:09.575 INFORMACIÓN [http-nio-8080-exec-15] es.gob.afirma.triphase.signer.processors.PAdESTriPhasePreProcessor.preProcessPostSign Postfirma PAdES - Firma - FIN
02-Dec-2022 08:52:09.575 INFORMACIÓN [http-nio-8080-exec-15] es.gob.afirma.triphase.server.SignatureService.service  Se ha calculado el resultado de la postfirma y se devuelve. Numero de bytes: 168819
02-Dec-2022 08:52:09.576 INFORMACIÓN [http-nio-8080-exec-15] es.gob.afirma.triphase.server.SignatureService.service Almacenamos la firma mediante el DocumentManager
02-Dec-2022 08:52:09.576 INFORMACIÓN [http-nio-8080-exec-15] es.gob.afirma.triphase.server.document.FileSystemDocumentManager.storeDocument Escribiendo el fichero: C:\DocFirmados\Lotes\salida\prueba.pdf
02-Dec-2022 08:52:09.577 INFORMACIÓN [http-nio-8080-exec-15] es.gob.afirma.triphase.server.SignatureService.service Documento almacenado
02-Dec-2022 08:52:09.577 INFORMACIÓN [http-nio-8080-exec-15] es.gob.afirma.triphase.server.SignatureService.service == FIN POSTFIRMA

Da la sensación que falla algo en la pre-firma, pero no sabemos si por temas de configuración o bien por estar el lote mal formado (aunque antes nos funcionó con esos lotes y configuración).

Podemos encontrar más información sobre el despliegue-configuración del triphase así como de la formación de los lotes, la forma de llamar lo y demás por algún sitio que no sea el manual del integrador???

Hay ejemplos aquí en el github?? (no los hemos encontrado)

¿Alguna idea de cuáles pueden ser nuestros fallos?

Muchas gracias.

Gamuci commented 1 year ago

Buenas tardes:

El error que se muestra en servidor es por confianza en el SSL. Creo que hay un error en la lógica de descarga de los datos para la firma trifásica y no se tiene en cuenta el valor de la propiedad de conexiones seguras al descargar los documentos del lote de una URL. En el lote estáis usando:

https://MiServidorLocal/Firma/InfOrdenComisionServicio1.pdf

Prueba a sustituir esa URL por una HTTP en lugar de HTTPS. Echaré también un vistazo para corregir el problema por si fuera eso.

En GitHub hay una página de pruebas de la firma de lotes, pero creo que te aportará poco: https://github.com/ctt-gob-es/clienteafirma/blob/master/afirma-ui-miniapplet-deploy/src/main/webapp/clienteafirma-batch-xml.html

Por otra parte, hay intención de publicar muy pronto la versión de AutoFirma 1.8 y el JavaScript de despliegue. En enero como tarde. Esta versión y su JavaScript incluyen un nuevo mecanismo de firma de lotes. Más sencillo de usar, más óptimo, más flexible y compatible con los DocumentManager de firma trifásica. Te dejo el enlace al nuevo manual del integrador: https://github.com/ctt-gob-es/clienteafirma-docs/blob/master/MCF_manual-integrador_ES.docx

Un saludo,

sanmolhec commented 1 year ago

Pues no sabemos qué le pasará, ya estamos muy perdidos, pero el https parece que no es, probando con este lote:

<?xml version="1.0" encoding="utf-8"?>
<signbatch xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" concurrenttimeout="0" stoponerror="false" algorithm="SHA512withRSA" xmlns="http://tempuri.org/signbatch.xsd">
  <singlesign Id="id1">
    <datasource>http://MiServidorLocal/Firma/InfOrdenComisionServicio1.pdf</datasource>
    <format>PAdES</format>
    <suboperation>sign</suboperation>
    <extraparams />
    <signsaver>
      <class>es.gob.afirma.signers.batch.SignSaverFile</class>
      <config>RmlsZU5hbWU9QzovRG9jRmlybWFkb3MvTG90ZXMvTG90ZV8xMzMxNDcyNDIzODU5MjIxNTZfMS5wZGY=</config>
    </signsaver>
  </singlesign>
  <singlesign Id="id2">
    <datasource>http://MiServidorLocal/Firma/InfOrdenComisionServicio2.pdf</datasource>
    <format>PAdES</format>
    <suboperation>sign</suboperation>
    <extraparams />
    <signsaver>
      <class>es.gob.afirma.signers.batch.SalvarFicheroFirmado</class>
      <config>RmlsZU5hbWU9QzpcXERvY0Zpcm1hZG9zXFxMb3Rlc1xcTG90ZV8xMzMxNDcyNDIzODU5MjIxNTZfMi5wZGY=</config>
    </signsaver>
  </singlesign>
  <singlesign Id="id3">
    <datasource>https://MiServidorLocal/Firma/InfOrdenComisionServicio2.pdf</datasource>
    <format>PAdES</format>
    <suboperation>sign</suboperation>
    <extraparams />
    <signsaver>
      <class>es.gob.afirma.signers.batch.SalvarFicheroFirmado</class>
      <config>RmlsZU5hbWU9QzpcXERvY0Zpcm1hZG9zXFxMb3Rlc1xcTG90ZV8xMzMxNDcyNDIzODU5MjIxNTZfMy5wZGY=</config>
    </signsaver>
  </singlesign>
  <singlesign Id="id4">
    <datasource>https://MiServidorLocal/Firma/InfOrdenComisionServicio1.pdf</datasource>
    <format>PAdES</format>
    <suboperation>sign</suboperation>
    <extraparams />
    <signsaver>
      <class>es.gob.afirma.signers.batch.SignSaverFile</class>
      <config>RmlsZU5hbWU9QzovRG9jRmlybWFkb3MvTG90ZXMvTG90ZV8xMzMxNDcyNDIzODU5MjIxNTZfNC5wZGY=</config>
    </signsaver>
  </singlesign>
  <singlesign Id="id5">
    <datasource>https://MiServidorLocal/Firma/InfOrdenComisionServicio2.pdf</datasource>
    <format>PAdES</format>
    <suboperation>sign</suboperation>
    <extraparams />
    <signsaver>
      <class>es.gob.afirma.signers.batch.SalvarFicheroFirmado</class>
      <config>RmlsZU5hbWU9QzpcXERvY0Zpcm1hZG9zXFxMb3Rlc1xcTG90ZV8xMzMxNDcyNDIzODU5MjIxNTZfNS5wZGY=</config>
    </signsaver>
  </singlesign>
  <singlesign Id="id6">
    <datasource>https://MiServidorLocal/Firma/InfOrdenComisionServicio2.pdf</datasource>
    <format>PAdES</format>
    <suboperation>sign</suboperation>
    <extraparams />
    <signsaver>
      <class>es.gob.afirma.signers.batch.SalvarFicheroFirmado</class>
      <config>RmlsZU5hbWU9QzpcXERvY0Zpcm1hZG9zXFxMb3Rlc1xcTG90ZV8xMzMxNDcyNDIzODU5MjIxNTZfNi5wZGY=/config>
    </signsaver>
  </singlesign>
</signbatch>

No funciona y tenemos estos log's:

AutoFirma en el equipo:

<record>
  <date>2022-12-05T14:45:38.100269400Z</date>
  <millis>1670251538100</millis>
  <nanos>269400</nanos>
  <sequence>40</sequence>
  <logger>es.gob.afirma</logger>
  <level>WARNING</level>
  <class>es.gob.afirma.signers.batch.client.BatchSigner</class>
  <method>sign</method>
  <thread>31</thread>
  <message>El servicio de firma devolvio un  error durante la prefirma: null</message>
</record>
<record>
  <date>2022-12-05T14:45:38.100269400Z</date>
  <millis>1670251538100</millis>
  <nanos>269400</nanos>
  <sequence>41</sequence>
  <logger>es.gob.afirma</logger>
  <level>SEVERE</level>
  <class>es.gob.afirma.standalone.protocol.ProtocolInvocationLauncherBatch</class>
  <method>processBatch</method>
  <thread>31</thread>
  <message>Error en el servicio de firma de lotes. StatusCode: 500. Descripcion: null</message>
</record>
<record>
  <date>2022-12-05T14:45:40.162611600Z</date>
  <millis>1670251540162</millis>
  <nanos>611600</nanos>
  <sequence>42</sequence>
  <logger>es.gob.afirma</logger>
  <level>SEVERE</level>
  <class>es.gob.afirma.standalone.protocol.ProtocolInvocationLauncherErrorManager</class>
  <method>showError</method>
  <thread>31</thread>
  <message>Ha ocurrido un error realizando la operación.
(SAF_26: Error en la comunicación con el servicio de firma de lotes.)</message>
</record>

Apache access log: 26.16.43.55 - - [05/Dec/2022:15:45:38 +0100] "POST /afirma-server-triphase-signer/BatchPresigner HTTP/1.1" 500 2614

Apache localhost log:

05-Dec-2022 15:45:38.093 GRAVE [http-nio-8080-exec-1] org.apache.catalina.core.StandardWrapperValve.invoke El Servlet.service() para el servlet [BatchPresigner] en el contexto con ruta [/afirma-server-triphase-signer] lanzó la excepción [La ejecución del Servlet lanzó una excepción] con causa raíz
    java.lang.AbstractMethodError
        at es.gob.afirma.signers.batch.xml.SignBatchXmlHandler.endElement(SignBatchXmlHandler.java:197)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(Unknown Source)
        at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(Unknown Source)
        at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source)
        at es.gob.afirma.signers.batch.xml.SignBatch.<init>(SignBatch.java:133)
        at es.gob.afirma.signers.batch.xml.SignBatchSerial.<init>(SignBatchSerial.java:31)
        at es.gob.afirma.signers.batch.server.BatchPresigner.service(BatchPresigner.java:78)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:779)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:177)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Unknown Source)

Apache catalina:

05-Dec-2022 15:45:38.066 INFORMACIÓN [http-nio-8080-exec-1] es.gob.afirma.signers.xml.XmlDSigProviderHelper.installProvider Instalamos el proveedor ApacheXMLDSig: org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI
05-Dec-2022 15:45:38.067 INFORMACIÓN [http-nio-8080-exec-1] es.gob.afirma.signers.xml.XmlDSigProviderHelper.configureXmlDSigProvider Se usara el proveedor 'ApacheXMLDSig': org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI
05-Dec-2022 15:45:38.077 INFORMACIÓN [http-nio-8080-exec-1] es.gob.afirma.signers.batch.BatchConfigManager.loadConfigFile Se cargara el fichero de configuracion signbatch_config.properties
05-Dec-2022 15:45:38.077 INFORMACIÓN [http-nio-8080-exec-1] es.gob.afirma.signers.batch.BatchConfigManager.loadConfigFile Se cargara el fichero de configuracion signbatch_config.properties desde el CLASSPATH
05-Dec-2022 15:51:18.364 INFORMACIÓN [http-nio-8080-exec-8] org.apache.coyote.http11.Http11Processor.service Error analizando cabecera de requerimiento HTTP
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
    java.lang.IllegalArgumentException: Se encontró un carácter inválido en el nombre del método. Los nombres de métodos HTTP deben ser tokens
        at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:419)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:271)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Unknown Source)
05-Dec-2022 15:51:18.364 INFORMACIÓN [http-nio-8080-exec-9] org.apache.coyote.http11.Http11Processor.service Error analizando cabecera de requerimiento HTTP
 Note: further occurrences of HTTP request parsing errors will be logged at DEBUG level.
    java.lang.IllegalArgumentException: Se encontró un carácter inválido en el nombre del método. Los nombres de métodos HTTP deben ser tokens
        at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:419)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:271)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:891)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1784)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Unknown Source)

Por lo que parece, aunque debería seguir procesando el lote, al dar error en el primer fichero (esta vez con http) se para en la prefirma y no continua. No vemos el porqué...

Dependiendo de la configuración y la forma de llamarlo obtenemos distintos detalles del error pero todos se remiten al SAF_26 sin ofrecer demasiada información de qué falla realmente, o no lo sabemos ver al menos.

Vamos a estuidiar el nuevo manual y la forma de crear los lotes con la nueva versión, pero hasta que salga esta versión a producción y hasta que podamos adaptar toda nuestra aplicación y código personalizado que crea los lotres dinámicamente a partir de los datos de nuestro sistema, necesitamos conseguir que funcione con la versión actual.

Muchas gracias. Saludos.

Gamuci commented 1 year ago

Hola:

La traza del catalina parece que no tiene nada que ver. Además de que en la traza no se hace referencia al servicio, se imprimió 6 minutos después de terminar la petición. Por la traza del Tomcat entiendo que el problema se da al intentar hacer uso de vuestra clase de guardado ("SalvarFicheroFirmado"). Esta clase debe implementar la interfaz "SignSaver" y esta ha cambiado alguna vez entre versiones del servidor trifásico. es posible que vuestra implementación no se ajuste a la interfaz de la versión del servidor trifásico que estáis usando. Revisando el código en la línea en la que da error el servicio, puede que el problema esté en que no implemente el método "isInitialized()". Revisad la implementación. Dejo aquí la interfaz SignSaver:

/* Interfaz para el guardado, almacenaje o envío de firmas una vez realizadas. / public interface SignSaver {

/** Guarda una firma electr&oacute;nica.
 * @param sign Definici&oacute;n de la firma que se hizo.
 * @param dataToSave Datos a guardar, resultado de la firma electr&oacute;nica.
 * @throws IOException Si hay problemas durante el proceso. */
void saveSign(final SingleSign sign, final byte[] dataToSave) throws IOException;

/** Deshace un guardado previo (para los modos transaccionales).
 * @param sign Identificador de la firma a deshacer. */
void rollback(final SingleSign sign);

/** Configura c&oacute;mo ha de guardarse la firma electr&oacute;nica.
 * cada implementaci&oacute;n requerir&aacute; unas propiedades distintas dentro del
 * objeto de propiedades.
 * @param config Propiedades de configuraci&oacute;n. */
void init(final Properties config);

/** Obtiene las propiedades de configuraci&oacute;n.
 * @return Propiedades de configuraci&oacute;n. */
Properties getConfig();

/** Indica si el manejador est&aacute; inicializado.
 * @return {@code true} si el manejador est&aacute; inicializado,
 * {@code false} en caso contrario.
 */
boolean isInitialized();

}

Por otra parte, os recomiendo que probéis primero con un lote de una petición:

Por los logs veo que se está cargando el fichero de configuración interno del WAR. Recomiendo que mejor uséis uno externo para simplificaros el hacer cambios. Podéis hacerlo arrancando el servidor de aplicaciones con el parámetro "-Dclienteafirma.config.path=DIRECTORIO_CONFIGURACION" para configurar el directorio en el que debe buscarse el fichero "signbatch_config.properties" con la configuración del servicio.

Por último, aunque creo que ya lo estáis haciendo, recordad que tenéis que meter el JAR que contiene vuestro SignSaver en el directorio "lib" del WAR del servicio.

Un saludo.

sanmolhec commented 1 year ago

Hola.

Hemos ido avanzando y corrigiendo errores, como problemas de acceso de los servidores url (visibilidad entre servidores, CORS...), permisos de escritura en los directorios de destino y alguna cosilla más (como el formato de la ruta "FileName=C:/Firmados/Lotes/Lote_1.pdf" o que la etiqueta extraparams vacía simple cerrada <extraparams /> no puede ser y debe ser con apertura y cierre <extraparams></extraparams>).

Pero lo que realmente generaba el error que nos ha tenido muy entretenidos era que la interfaz de la clase de guardado -SignSaver- se ha ampliado y no se implementaban todos los métodos en nuestra clase desarrollada antigua (con lo que el nuevo SignSaver no es retrocompatible, ojo con esto si tenéis desarrollos "viejos").

Hemos implementado la nueva interfaz y ya nos funciona.

Eso sí, conseguir compilar el proyecto maven ha sido una odisea... ¿No hay una forma fácil de hacerlo? (ha dado muchos problemas de dependencias y ha habido que compilar el trifase entero además de algunas otras librerías). Porque en nuestro caso que no somos desarrolladores Java, la primera vez que lo compilamos hace años no fue complicado y no nos dieron errores pero esta vez ha costado demasiado esfuerzo para lo poco que debería ser.

Muchas gracias.

Saludos.