jueves, 25 de julio de 2019

Autofirma, Ubuntu 18.04. Perdida de certificados. Ejecución en consola de Autofirma. Diferentes resultados de firma. Cades implicit. PKCS#11

0. Introducción

Cuando se instala una nueva vetrsión de Java o se actualiza Ubuntu, se pueden perder los certificados instalados en Mozilla, y por tanto se pierden los certificados de Autofirma.

1. Verificar que Mozilla tenga los certificados cargados:


En Preferencias->Seguridad y privacidad ->Ver certificados me ha aparecido una panntalla que no ha aparecido ningún certificado ni parecía el botón de importar.
La solución es tan tonta como ampliar la pantalla arrantrando como indica la flecha y ahora ya se pueden importar certificados p12 pues ya aparece el botón de importar




2. Restaurar instalación de Autofirma


Si  no aparece el certificado en Autofirma, hay que restaurar la instalación. Para ello entramos en Autofirma ->Herramientas->Reestaurar instalación

Y nos pide salir del navegador si está abierto.

Ojo solo funciona con java 1.8, Ojo solo funciona con un JDK de Oracle, de todas formaspor tanto hay que buscar la ruta de instalación de java 1.8  de Oracle y modificar el fichero /usr/bin/Autofirma para que contenga


1
2
3
#!/bin/bash
# java -jar /usr/lib/AutoFirma/AutoFirma.jar $*
/usr/lib/jvm/java-8-oracle/jre/bin/java  -jar /usr/lib/AutoFirma/AutoFirma.jar $*

Donde la última línea indica la llamada a java con la ruta absoluta del jdk 1.8

En teroría ya debería encontrar los certificados

3. Ejecutar Autofirma desde la línea de comandos


Como se dice muy bien el Atareado se puede utilizar en línea de comandos. Os copio lo que el ha hecho a falta de probarlo. De momento yo no lo he podido hacer funcionar por no saber mi alias


1
2
3
4
5
#firmar un documento pdf
AutoFirma sign -i entrada.pdf -o salida.pdf -store pkcs12:/home/lorenzo/Escritorio/certificado.p12 -alias firma -password micontreña

#firmar los documentos pdf de una carpeta
for i in entrada_*.pdf; do AutoFirma sign -i $i -o ${i/.pdf/}_signed.pdf -store pkcs12:/home/lorenzo/Escritorio/certificado.p12 -alias firma -password micontraseña; done


Pero si miramos el manual de Autofirma, vemos que si se puede obtener el alias e incluso utilzar otros almacenes de claves.

Si ejecutamos desde /usr/bin:

./Autofirma cmd -help

obtenemos:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Comandos cmd:

  sign   (firma de fichero)
  cosign  (cofirma de fichero)
  countersign  (contrafirma de fichero)
  listaliases  (lista los alias disponibles en el almacen)
  verify  (abre un panel con la informacion de validacion de una firma o certificado)

  batchsign  (firma/multifirma de lotes de ficheros)

  createdigest  (creacion de huella digitales con interfaz grafica)

  checkdigest  (comprobacion de huella digitales con interfaz grafica)

Y si le damos a la ayuda de firmar

./Autofirma sign -help

obtenemos:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Sintaxis: AutoFirma sign [options...]

options

  -gui    (Realiza la operacion con entorno grafico)
  -i inputfile   (Ruta del fichero de entrada)
  -o outputfile   (Ruta del fichero de salida)
  -algorithm algo  (Algoritmo de firma)
  -format   (Establece el formato de firma)
    auto   (Seleccion de formato en base al fichero de entrada)
    cades   (Formato CAdES)
    pades   (Formato PAdES)
    xades   (Formato XAdES)
    facturae  (Firma de factura electronica)
  -config extraParams  (Properties en texto plano con la configuracion de la operacion)
  -store   (Establece el almacen de claves. Por defecto, el del sistema)
    auto   (Almacen de claves del sistema)
    windows  (Almacen de claves de Windows)
    mac   (Almacen de claves de Mac OS X)
    mozilla  (Almacen de claves de Mozilla Firefox)
    dni   (DNI electronico)
    pkcs12:p12file  (Almacen PKCS#12. "p12file" es la ruta del almacen)
    pkcs11:p11file  (Almacen PKCS#11. "p11file" es la ruta del controlador)
  -password password  (Establece la contrasena del almacen)
  -alias alias   (Alias del certificado de firma)
  -filter filter  (Filtro para seleccionar el certificado de firma)
  -xml    (Formatea la respuesta como XML)

Y si le damos a la ayuda de ver los alias:


./Autofirma listaliases -help


obtenemos:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Sintaxis: AutoFirma listaliases [options...]

options

  -store   (Establece el almacen de claves. Por defecto, el del sistema)
    auto   (Almacen de claves del sistema)
    windows  (Almacen de claves de Windows)
    mac   (Almacen de claves de Mac OS X)
    mozilla  (Almacen de claves de Mozilla Firefox)
    dni   (DNI electronico)
    pkcs12:p12file  (Almacen PKCS#12. "p12file" es la ruta del almacen)
  -password password  (Establece la contrasena del almacen)
  -xml    (Formatea la respuesta como XML)


Veamos pues alguna de las diferentes opciones de firma

3.1 Utilizar el almacén de certificados de Mozilla

Primerament debemos obtener el ALIAS. desde /usr/bin ejecutamos:


1
./AutoFirma  listaliases -store mozilla

Nos devuelve:


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
de jul. 26, 2019 8:51:26 AM es.gob.afirma.keystores.mozilla.MozillaKeyStoreUtilities loadNSS
INFO: Configuracion de NSS para SunPKCS11:
name=NSSCrypto-AFirma
library=/usr/lib/thunderbird/libsoftokn3.so
attributes=compatibility
slot=2
showInfo=false
allowSingleThreadedModules=true
nssArgs="configdir='sql:/USERHOME/.mozilla/firefox/fofoapzr.default-release' certPrefix='' keyPrefix='' flags='readOnly'"
de jul. 26, 2019 8:51:26 AM es.gob.afirma.keystores.mozilla.MozillaKeyStoreUtilities loadNssJava8
INFO: NSS necesita una precarga o tratamiento de sus dependencias: java.lang.reflect.InvocationTargetException
de jul. 26, 2019 8:51:26 AM es.gob.afirma.keystores.mozilla.MozillaKeyStoreUtilities loadNSS
INFO: Proveedor PKCS#11 para NSS anadido: SunPKCS11-NSSCrypto-AFirma
de jul. 26, 2019 8:51:26 AM es.gob.afirma.keystores.AOKeyStoreManager init
INFO: Inicializamos el almacen de tipo: DNIe y tarjetas FNMT-TIF
de jul. 26, 2019 8:51:26 AM es.gob.afirma.keystores.KeyStoreUtilities addPreferredKeyStoreManagers
INFO: No se ha encontrado un DNIe: java.security.ProviderException: No se ha podido inicializar el proveedor de DNIe: es.gob.jmulticard.apdu.connection.NoReadersFoundException: No se detectaron lectores de tarjetas en el sistema
de jul. 26, 2019 8:51:26 AM es.gob.afirma.keystores.mozilla.MozillaKeyStoreUtilities getMozillaPKCS11Modules
INFO: Se incluiran los modulos nativos de DNIe/CERES si se encuentran configurados
de jul. 26, 2019 8:51:26 AM es.gob.afirma.keystores.mozilla.MozillaKeyStoreUtilities getMozillaPKCS11Modules
INFO: Obtenidos los modulos externos de Mozilla desde 'pkcs11.txt'
de jul. 26, 2019 8:51:26 AM es.gob.afirma.keystores.mozilla.MozillaUnifiedKeyStoreManager init
INFO: No se han encontrado modulos PKCS#11 externos instalados en Firefox
EPN1

Y en la línea 24 vemos "EPN1" que es el alias en cuestión.

Ahora nos toca firmar:


1
./AutoFirma  sign -i /home/ximo/xml/xml1.xml -o /home/ximo/xml/xmlq_firma.xsig -format xades -store mozilla -alias EPN1

3.2 Utilizar un fichero "p12" como almacén de certificados
Primerament debemos obtener el ALIAS. desde /usr/bin ejecutamos:


1
./AutoFirma  listaliases -store pkcs12:/home/ximo/certs/mycert.p12 -password myPassword

Nos devuelve simplemente "epn1" que es nuestro alias en cuestión.


También hubieramos podido utilizar keytool  como se dice en Stackoverflow:

1
keytool -v -list -storetype pkcs12 -keystore /home/ximo/certs/mycert.p12 -storepass myPassword

y saldría:

1
2
3
4
5
6
Keystore type: PKCS12
Keystore provider: SUN

Your keystore contains 1 entry

Alias name: epn1

Con lo que el alias resultante es el mismo.

Ahora desde /usr/bin intentamos firmar:


1
./AutoFirma  sign -i /home/ximo/xml/xml1.xml -o /home/ximo/xml/xml1_firma1.xsig -format xades -store pkcs12:/home/ximo/certs/mycert.p12 -alias epn1 -password myPassword


Y obtenemos el mismo resultado.

4. Diferentes formatos de firma al ejecutar en "GUI" y línea de comandos

Hay alguna sutileza que trae como consecuencia que los formatos de salida sean ligeramente distintos.

Veamos una imagen donde se ve que la estructura de la firma es prácticamente la misma pero cambia la localizaciíon del contenido a firmar.

La parte de arriba corresponde a una firma en línea de comandos y la de la parte de abajo desde la opción "GUI" (graphic user interface).

Se remarca los contenidos a firmar.


Si se intentan validar los ficheros con Autofirma (Archivo-> Ver Firma) se observa que ambos ficheros son correctos.

5. Firmar con tarjeta en Ubuntu

Para firmar con tarjeta hay que definir el lector de tarjetas criptográficas  tal como se ha indicado en este post.

Una vez comprobado que funciona com Mozilla, se prueba con el programa keystore explorer, y vamos al menú superior y le indicamos File > Open Special > Open PKCS#11




se le da la librería de dicha tarjeta que es /usr/lib/lib/libaetpkss.so




y nos muestra los alias de los certificados (en este caso es EPN1)



Por tanto para elegir nuestro certificado utilizaremos

-store pkcs11:/usr/lib/libaetpkss.so -alias EPN1 -password myPassword

Y nuestro comando quedaria 
/usr/bin/AutoFirma  sign  -i ficheroAFirmar -o ficheroFirma -format cades -config "mode=implicit" -store pkcs11:/usr/lib/libaetpkss.so -alias EPN1 -password myPassword


6. Firma de expedientes. Firmar el índice con formato cades implícito

Según Gamuzi podemos ejecutar este comando:

/usr/bin/AutoFirma  sign  -i rutaFicheroEntrada -o rutaFicheroSalida -format cades -config "mode=implicit" -store pkcs12:$(RESOURCES)/certs/mycert.p12 -alias epn1 -password myPassword
Siendo :
pkcs12:$(RESOURCES)/certs/mycert.p12  la ruta al fichero donde está el certificado
epn1  el alias del certificado (se puede ver usando el programa KeyStore Explorer  )
myPassword  el password del certrificado

Para que sea el formato cades implicito: -format cades -config "mode=implicit"  

7. Firma de expedientes. Firmar el índice con formato XadES Detached 

También se puede utilizar el AutoFirma.jar ejecutado desde una versión de java
/home/eduard/MyPrograms/jdk-Oracle-11.0.17/bin/java -jar /usr/lib/AutoFirma/AutoFirma.jar  sign  -i rutaFicheroEntrada -o rutaFicheroSalida -format xades -store pkcs12:rutaCertificado -alias epn1 -password myPassword  -config "format=XAdES Detached"
Siendo :
pkcs12:rutaCertificado la ruta al fichero donde está el certificado en formato .p12
epn1  el alias del certificado (se puede ver usando el programa KeyStore Explorer  )
myPassword  el password del certrificado

Para que sea el formato XadeES Detached -format xades -config "format=XAdES Detached"


8. Manual de opciones de Autofirma

Este manual es una pasada.


5 comentarios :

  1. has intentado firmar con VPS, sin lineas de comandos?

    ResponderEliminar
  2. Según tengo entendido y de acuerdo a lo que leí en www.descargarautofirma.es antes de descargar autofirma. Ellos indican en las preguntas frecuentes que colocan en su post de Guia de inicio "o algo así" que No existe la opción de descarga autofirma para Ubuntu.

    Espero sea util esta información

    ResponderEliminar
    Respuestas
    1. Uno de los problemas que tenemos todos es la desinformación, lo que nos lleva muchas hora de "googleo". Autofirma en Ubuntu si funciona, por algo està desarrollada en Java.

      Eliminar
  3. Si amigo eso lo entiendo solo que tengo entendido que no existe en el manual de usuario de Autofirma, lo comento porque vi la información detallada aquí [url]https://www.descargarautofirma.es/[/url]

    ResponderEliminar
  4. Hola!
    Estoy teniendo problemas para firmar un XML cuando le pasamos el parámetro "format=XAdES Enveloped" a alguno más le pasa?
    Ejecutando el comando: autofirma sign -i fichero_a_firmar.xml -o fichero.xsig -store pkcs12:/etc/ssl/cert.p12 -password ********** -filter /etc/ssl/cert.p12 -format xades -xml -config "format=XAdES Enveloped"
    Obtengo:
    No se reconoce el parametro Enveloped
    Sintaxis: AutoFirma sign [options...]

    ResponderEliminar