Firma digital en Ubuntu

Creo que, como a todo el mundo, me desespera esperar. Pero esta desesperación llega a su máximo apogeo, si además tengo que hacer cola. Por esta razón, acudir a una oficina a entregar documentación es algo que sale fuera de mis entendederas. ¿Como es posible que en pleno siglo XXI todavía tengamos que presentar documentos en papel?. En este artículo verás como utilizar la firma digital de documentos PDF y otros archivos con la aplicación AutoFirma, y también como hacerlo directamente con LibreOffice.

Parece que la administración, poco a poco, se va modernizando. Pero, es tan poco a poco… Pero, no solo la administración pública, lo mismo sucede con determinadas empresas. Hace unos pocos meses tuve que acudir a la oficina de un banco para firmar unos documentos. ¿De verdad es necesario?.

Hoy en día, en pleno siglo XXI, podemos comprar cualquier cosa sin tener que aparecer por la tienda. Podemos enviar y recibir dinero. Y sin embargo, todavía hay quien se resiste a este avance. Todavía hay quien nos hace pasar por la oficina, para vete a saber que tontería…

Vamos con AutoFirma para la firma electrónica de PDF…

AutoFirma, o firma digital de PDF y otros archivos

¿Que es AutoFirma?

AutoFirma es una sencilla aplicación de escritorio, que permite la firma electrónica de PDF y otros documentos. AutoFirma selecciona el formato de firma mas adecuado para el documento que vamos a firmar. Además permite previsualizar los firmantes y el documento firmado.

Además AutoFirma es software libre, liberado bajo licencia GPL versión 2, o bajo licencia European Software License 1.1.

En la versión 1.6.2, que es la que estaba vigente en el momento de escribir este artículo, ya están incluidas una serie de mejoras como,

  • El soporte completo de DNIe 3.0
  • La generación de firmas visibles en PDF
  • Se mejoraba la integración con tarjetas inteligentes
  • Se ha añadido compatibilidad con Java 9. Esto, a pesar de que en los requerimientos del paquete debian requiere Java 8. En cuanto a Java soporta tanto OpenJDK 8, como la versión de Java 8 Oracle.

Tienes que tener en cuenta que AutoFirma no solo sirve para firmar documentos PDF, sino que también puedes firmar archivos XML, y cualquier otro tipo de documento.

Tanto en Linux como en el resto de plataformas, se puede utilizar AutoFirma en modo gráfico, como directamente en el terminal. Esto último, como veremos mas adelante, tiene la ventaja de que podemos firmar no solo un archivo, sino también un lote de archivos.

Certificados y privacidad

La aplicación AutoFirma, utiliza los certificados digitales X.509v3, y las claves privadas asociadas a estos certificados. Evidentemente, es necesario que estén instalados o bien, en el almacén de claves del sistema operativo, o bien, en el propio navegador.

Además permite el uso de dispositivos externos como son lectores de tarjetas externas, y las correspondientes tarjetas. Así, puedes utilizar el DNIe o las tarjetas criptográficas de la ACCV, por ejemplo.

Es importante resaltar, que AutoFirma no registra información sobre el usuario. Tampoco utiliza cookies o nigún otro medio de almacenamiento en el navegador. Aunque si que guarda los datos correspondientes a la última ejecución para el caso de que se produjera un error, poder dar soporte al usuario.

Instalación

Para instalar AutoFirma en nuestro equipo, tenemos que descargar la versión en curso. Puedes descargar la última versión de AutoFirma desde el enlace. O bien, abrir un terminal y ejecutar las siguientes órdenes. Además de instalar la aplicación, en las siguientes órdenes, he añadido las dependencias necesarias, para facilitarte el trabajo.

sudo apt install openjdk-8-jre
sudo apt install libnss3-tools
mkdir temporal_autofirma
cd temporal_autofirma
wget --no-check-certificate https://estaticos.redsara.es/comunes/autofirma/1/6/5/AutoFirma_Linux.zip
unzip AutoFirma_Linux.zip
sudo dpkg -i *.deb
cd ..
rm -rf temporal_autofirma

En el caso de que lo quisieras desinstalar, la operación sería tan sencilla como ejecutar la siguiente línea en el terminal,

sudo apt remove --purge autofirma

Desde luego, también podrías desinstalarla desde el Centro de Software de Ubuntu o mediante otras aplicaciones como AppGrid, sobre la que ya comenté en el artículo AppGrid, una alternativa al Centro de Sofware de Ubuntu. Esta aplicación, me resulta muy atractiva porque es muy ligera, y no está siempre funcionando en segundo plano.

Funcionamiento en modo gráfico

Una vez instalado AutoFirma en tu equipo, el funcionamiento es muy sencillo. El primer paso iniciar la aplicación y seleccionar el archivo que queremos firmar.

Firma digital en Ubuntu. Ejemplo autofirma. Captura 1

En el caso de que el archivo sea un documento PDF, nos dará la posibilidad de hacer la firma visible dentro del PDF. El documento PDF será totalmente legible.

Firma digital en Ubuntu. Ejemplo autofirma. Captura 2

Además nos permite ver una previsualización del resultado, así como ajustar el formato y el contenido del área de texto.

Firma digital en Ubuntu. Ejemplo autofirma. Captura 3
Firma digital en Ubuntu. Ejemplo autofirma. Captura 4

También podemos personalizar la firma, con las siguientes palabras clave que serán sustituidas de acuerdo a los siguientes criterios,

  • $$SUBJECTCN$$Nombre común (CN, Common Name) dentro del X.500 Principal del titular del certificado de firma.
  • $$ISSUERCN$$Nombre común (CN, Common Name) dentro del X.500 Principal del emisor del certificado de firma.
  • $$CERTSERIAL$$Número de serie del certificado de firma.
  • $$SIGNDATE=PATRÓN$$Fecha de la firma, donde PATRÓN debe indicar el formato en el que debe mostrarse la fecha, siguiendo el esquema definido por Oracle para la clase SimpleDateFormat.

Por otro lado, con otros tipo de documentos, estos quedarán ilegibles. Así por ejemplo los archivos xml, se quedan inutilizables, y no he conseguido descubrir como sacarles provecho. Mientras que otros tipos de archivos, se pueden devolver a su estado original, visitando la página de validación de firmas. Donde una vez comprobada la validez de la firma nos da la posibilidad de descargar el archivo original.

Así, los formatos de firma por defecto son,

  • Documentos PDF -> PAdES
  • Documentos OOXML de Microsoft Office -> OOXML
  • Facturas electrónicas -> FacturaE
  • Ficheros XML genéricos ->XadES
  • Ficheros ODF de LibreOffice/OpenOffice -> ODF
  • Ficheros binarios genéricos -> CAdES

Llegados a este punto indicar que no he conseguido firmar los archivos de LibreOffice desde AutoFirma y que posteriormente fueran legibles. Pero, si que lo he hecho directamente desde LibreOffice como comentaré mas adelante. También es posible, realizar la firma digital de documentos PDF directamente desde LibreOffice.

Funcionamiento desde el terminal

Hacer funcionar AutoFirma desde el terminal tiene todas las ventajas que ya te puedes imaginar. Al fin y al cabo, puedes firmar un lote completo de documentos sin tener que ir paso a paso.

Sin embargo, no he conseguido utilizar los certificados instalados en Firefox. Finalmente hice una copia en un archivo, y a partir de ahí todo fué coser y cantar. Así para firmar un archivo PDF, la orden sería,

AutoFirma sign -i entrada.pdf -o salida.pdf -store pkcs12:/home/lorenzo/Escritorio/certificado.p12 -alias firma -password micontreña

¿Y si en lugar de querer firmar un solo documento quieres firmar una docena de documentos? Pues tan sencillo como utilizar la siguiente orden,

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

Aquí te tengo que advertir que tengas mucho cuidado con los espacios, comillas y demás signos de puntuación. Lo cierto es que AutoFirma no los tolera nada bien.

LibreOffice, o firma digital de documentos propios y PDF

La otra opción que tenemos disponible es la utilización de LibreOffice. Si, lo has leído bien, con el propio LibreOffice puedes estampar tu firma digital. Y no solo puedes poner tu firma digital en documentos de LibreOffice, sino que también lo puedes hacer en documentos PDF.

Como verás a continuación, la operación es realmente sencilla. Tan solo tienes que abrir cualquier documento de LibreOffice, y desde el menú Archivo > Firmas digitales, se desplegará el siguiente cuadro de diálogo, donde te muestra las firmas actuales,

Para el caso de la firma de un archivo PDF, la operación es similar. Tienes que ir al menú Archivo > Firmas digitales > Firmar PDF Existente. Esta opción abrirá el documento PDF en LibreOffice Draw en modo de solo lectura. En la parte superior del documento, verás dos botones. Uno de los botones, te permite editar el documento PDF. El otro de los botones, te permite estampar la firma digital en el documento PDF.

Tanto en el caso de un documento de LibreOffice, como de un documento PDF, una vez firmados no los tienes que guardar, no hace falta LibreOffice los ha guardado en el momento de estampar la firma digital. Es mas, si lo guardas se perderá esa firma digital.

Conclusiones

Tienes aquí tres opciones para estampar la firma digital en tus documentos y archivos en Ubuntu. Cada uno de los métodos, tiene sus ventajas e inconvenientes. Respecto al uso de AutoFirma está la dependencia de Java. A mi particularmente Java no me gusta por que consume una exageración de recursos. Sin embargo, la posibilidad de realizar la firma de docenas de documentos desde el terminal, es una cuestión que me seduce bastante.

Desde luego, si tu caso es que tienes que estampar la firma digital en muchos documentos, y muy a menudo, la solución de AutoFirma desde el terminal, es la mas interesante, con independencia de Java. Si por contra solo tienes que firmar de vez en cuando documentos de LibreOffice o PDF, la solución de LibreOffice es posible que sea la mas interesante. Y digo que es posible, por el hecho de que pueda deformar el documento PDF al importarlo a LibreOffice Draw.

En fin, como ves, al final lo dejo a tu elección, dependiendo de cada caso podrás decantarte por una opción u otra. Para pocos documentos en formato ODF, sin lugar a dudas LibreOffice. Para PDF y otros documentos AutoFirma en modo gráfico. Para muchos documentos, AutoFirma desde el terminal, sin lugar a dudas.

16 comentarios en “Firma digital en Ubuntu

  1. UN
    Una pregunta hace 6 años

    ¿Se puede utilizar con el Certificado Digital de la FNMT?

  2. MA
    Marc Juberó hace 6 años

    Buenas tardes, antes que nada, gracias por el artículo, muy ilustrativo y fácil de seguir.
    Estoy buscando alternativas a JSignPdf, por temas de discontinuidad y lentitud, y la opción CLI de AutoFirma parece interesante, no obstante, me he visto incapaz de hacer que la firma sea visible en el documento final. Por casualidad lo habéis intentado?

    Mil gracias.

    1. EL
      El atareao hace 6 años

      Hola Marc,
      Si, la firma visible funciona perfectamente. En él propio artículo está explicado cómo hacerlo.
      Saludos

      1. MA
        Marc Juberó hace 6 años

        Si, desde la GUI también he logrado hacerlo, el problema lo tengo con la línea de comandos, que no consigo que se vea la firma.

        Gracias!

  3. SA
    Salvatore hace 6 años

    Hola Atareao, he seguido el tutorial pero me encuentro con que no se ejecuta. Al iniciarlo en terminal con el comando ‘AutoFirma’ me lanza el siguiente error:

    Exception in thread «main» java.awt.AWTError: Assistive Technology not found: org.GNOME.Accessibility.AtkWrapper
    at java.desktop/java.awt.Toolkit.newAWTError(Toolkit.java:472)
    at java.desktop/java.awt.Toolkit.fallbackToLoadClassForAT(Toolkit.java:488)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
    at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:177)
    at java.base/java.util.HashMap$KeySpliterator.forEachRemaining(HashMap.java:1608)
    at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
    at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
    at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
    at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
    at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:497)
    at java.desktop/java.awt.Toolkit.loadAssistiveTechnologies(Toolkit.java:532)
    at java.desktop/java.awt.Toolkit.getDefaultToolkit(Toolkit.java:613)
    at java.desktop/sun.swing.SwingUtilities2.getSystemMnemonicKeyMask(SwingUtilities2.java:2143)
    at java.desktop/javax.swing.plaf.basic.BasicLookAndFeel.initComponentDefaults(BasicLookAndFeel.java:1096)
    at java.desktop/javax.swing.plaf.metal.MetalLookAndFeel.initComponentDefaults(MetalLookAndFeel.java:440)
    at java.desktop/javax.swing.plaf.basic.BasicLookAndFeel.getDefaults(BasicLookAndFeel.java:150)
    at java.desktop/javax.swing.plaf.metal.MetalLookAndFeel.getDefaults(MetalLookAndFeel.java:1560)
    at java.desktop/javax.swing.UIManager.setLookAndFeel(UIManager.java:587)
    at java.desktop/javax.swing.UIManager.setLookAndFeel(UIManager.java:628)
    at java.desktop/javax.swing.UIManager.initializeDefaultLAF(UIManager.java:1403)
    at java.desktop/javax.swing.UIManager.initialize(UIManager.java:1516)
    at java.desktop/javax.swing.UIManager.maybeInitialize(UIManager.java:1482)
    at java.desktop/javax.swing.UIManager.getDefaults(UIManager.java:708)
    at java.desktop/javax.swing.UIManager.getColor(UIManager.java:750)
    at es.gob.afirma.standalone.LookAndFeelManager.(LookAndFeelManager.java:35)
    at es.gob.afirma.standalone.SimpleAfirma.main(SimpleAfirma.java:484)
    Caused by: java.lang.ClassNotFoundException: org.GNOME.Accessibility.AtkWrapper
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:374)
    at java.desktop/java.awt.Toolkit.fallbackToLoadClassForAT(Toolkit.java:485)
    … 25 more

    ¿Alguna idea de como solucionarlo?

  4. CA
    Carlos Espino Angulo hace 6 años

    Después de varios intentos fallidos, y viendo las líneas de instalación, caí en la cuenta de que la versión de Java es la 8 y el tener instalada, también, la 11 me daba problemas. La siguiente instrucción permite seleccionar la versión de Java a utilizar por defecto:

    sudo update-alternatives –config java

    …y asunto solucionado!

    1. EL
      El atareao hace 6 años

      Si, en el artículo comento que requiere Java 8. He probado con otras versiones de Java y no funciona, al igual que te sucede a ti.
      Saludos.

  5. CO
    Con Ubuntu Server 16.04 hace 6 años

    Con Ubuntu Server 16.04 si al ejecutar el comando con «-alias» os dá error «No se hay ninguna entrada en el almacen con el alias indicado….» cambiad «-alias» por «-filter», ejemplo:
    AutoFirma sign -i entrada.pdf -o salida.pdf -store pkcs12:/home/lorenzo/Escritorio/certificado.p12 -filter cualquiertexto -password micontrena
    Dará error (Se omitirá el filtro ‘cualquiertexto’ por no estar reconocido) pero firmará el documento
    Además con este método no es necesario tener instalado el certificado solo es necesario tener el archivo.p12

  6. JO
    Jose hace 2 años

    Gracias amigo. Llevaba varios días intentándolo sin éxito. Estaba al borde de un ataque de nervios y me ha funcionado por fin al ejecutar las instrucciones que incluyes en el apartado «INSTALACIÓN»

  7. LO
    lorenzogb hace 2 años

    Gracias Lorenzo, te sigo desde hace tiempo. Como bien indicas el problema es con los certificados en firefox y la solución que das -descargar el certificado en el ordenador- es la misma que utilizo… pero… hay sedes electronicas que requieren que firmes el documento «online» y ejecutes autofirma y no se cargan ni ejecuta en firefox, pero tampoco en Chromium la «autofirma» impidiendo su uso en esas webs con linux. Con Lubuntu, si fui capaz de firmar, ahora no lo soy (no dudo que sea por mi desconocimiento),no he sabido renunciar a W10, por este motivo, si bien el 99% lo hago dsd Ubuntu

    1. LL
      Lluc hace 2 años

      Acabo de firmar digitalmente sin problemas desde Ubuntu 20.04, con Firefox 101.0.1, Autofirma 1.7.1. Tengo instalado «java-14-openjdk» (puedes saber qué versión tienes activa con «sudo update-alternatives –config java»). Y instalé la librería «libnss3-tools» (sudo apt-get install libnss3-tools), ya que en versiones anteriores de Autofirma lo recomendaban (pero no sé si es necesario).
      Entonces no hace falta hacer copia de tu certificado digital desde Firefox. Simplemente abres el programa «Autofirma» i eliges el pdf que quieres firmar. O bien si firmas un documento desde la web, Firefox te pedirá permiso para usar Autofirma. Aceptas. Firmas y ya está. Si antes has denegado este permiso, puede que tengas que buscar en «Parámetros» del Firefox y desbloquear-lo. Un saludo.

  8. AD
    Adrián hace 1 año

    Cuidado con poner la contraseña del DNI directamente en la línea de comandos. Es muy inseguro y no está recomendado para nada.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *