Ir al contenido principal

Firma digital de documentos usando LibreOffice

 

Introducción

Una firma digital es un proceso mediante el cual se puede consignar a un documento digital la identidad de una persona. Permitiendo, mediante el uso de certificados avalados por autoridades certificadoras, a cualquier persona verificar que el documento digital verdaderamente pertenece a la persona firmante. Además, también previene que, una vez firmado un documento, éste pueda ser modificado.
El proceso de firmado se puede realizar utilizando distinto software, como por ejemplo el Autofirma o desde páginas específicas de Internet, casi siempre implicando el uso de applets de Java. En el presente artículo nos vamos a centrar en explicar como realizar dicho proceso de firma y su verificación utilizando la suite ofimática LibreOffice corriendo sobre Ubuntu.
Para las pruebas y el desarrollo de este artículo voy a utilizar el Ubuntu 20.04.3 LTS y el LibreOffice 6.4.7.

Verificación del entorno

A diferencia de Windows u OSX, en Linux no existe un almacén de certificados centralizado y único para el sistema. La suite ofimática LibreOffice busca los certificados digitales por orden en las siguientes carpetas:
  • Thunderbird: se buscarían en la carpeta $HOME/.thunderbird. Si no solemos usar el programa como es mi caso ya que suelo usar correos web,  deberíamos asegurarnos de desinstalarlo y de eliminar esa carpeta para evitar que el LibreOffice vaya a buscar el certificado ahí.
    Para desinstalar el Thunderbird y eliminar el perfil que haya creado en el home si alguna vez lo hemos abierto, lo podemos hacer en la terminal con los comandos:
    $sudo apt purge thunderbird
    $rm -rf ~/.thunderbird
  • Mozilla: normalmente no existe.
  • FirefoxLa ruta del perfil de Firefox suele ser algo así como: $HOME/.mozilla/firefox/ymsag6g9.default. En mi caso, esta es la opción que elegí para almacenar el certificado.
  • Default: es la ruta por defecto que en el momento de hacer este artículo aún no he averiguado a que se refiere. 
En cualquier caso, siempre podemos averiguar cual es el perfil que utilizará el LibreOffice para buscar los certificados. Para ello podemos ejecutar el siguiente script Basic creando una macro en el propio LibreOffice
Abrimos el LibreOffice Writer, por ejemplo, y siguiendo las opciones del menú Herramientas/Macros/Organizar macros/Basic... llegamos hasta la ventana de Macros de Basic.
Cuando editamos se nos muestra la pantalla para modificar el código del Module 1


En esta pantalla eliminamos lo correspondiente a la Sub Main e introducimos el código de dos funciones que componen el script y que nos permitirán averiguar el almacén de certificados que usará LibreOffice para buscar el certificado digital para la firma. El código es:
Sub MozProfile
	Dim oMozBootstrap as Object
	Dim sMsg as String
	Dim sDefault as String
	oMozBootstrap = createUnoService( "com.sun.star.mozilla.MozillaBootstrap" )
	sMsg = "OpenOffice.org Mozilla Profile Detection" + Chr$(10) + Chr$(10)
	CheckMozProfile( oMozBootstrap, "Thunderbird", com.sun.star.mozilla.MozillaProductType.Thunderbird,	sMsg, sDefault )
	sMsg = sMsg + Chr$(10)
	CheckMozProfile( oMozBootstrap, "Mozilla", com.sun.star.mozilla.MozillaProductType.Mozilla, sMsg, sDefault )
	sMsg = sMsg + Chr$(10)
	CheckMozProfile( oMozBootstrap, "Firefox", com.sun.star.mozilla.MozillaProductType.Firefox, sMsg, sDefault )
	sMsg = sMsg + Chr$(10)
	CheckMozProfile( oMozBootstrap, "Default", com.sun.star.mozilla.MozillaProductType.Default, sMsg, sDefault )
	sMsg = sMsg + Chr$(10)
	sMsg = sMsg + "The first detected path will be used for certificates:" + Chr$(10)
	if Len( sDefault ) > 0 Then
		sMsg = sMsg + sDefault
	else
		sMsg = sMsg + "No profile found!"
	end if
	sMsg = sMsg + Chr$(10) + Chr$(10) + "You can overwrite the path with environment variable MOZILLA_CERTIFICATE_FOLDER" + Chr$(10) + " "
	MsgBox sMsg,64
End Sub

Sub CheckMozProfile( oMozBootstrap, TypeName, TypeID, sMsg, sDefault )
	Dim sProfile as String
	Dim sPath as String
	
	sMsg = sMsg + TypeName + ":" + Chr$(10) + "Profile name: "
	sProfile = oMozBootstrap.getDefaultProfile(TypeID)
	if Len( sProfile ) > 0 Then
		sMsg = sMsg + sProfile
		sPath = oMozBootstrap.getProfilePath(TypeID, sProfile )
		sMsg = sMsg + Chr$(10) + "Profile path: " + sPath + Chr$(10)
		if Len( sDefault ) = 0 Then
			sDefault = sPath
		end if
	else
		sMsg = sMsg + "NOT FOUND" + Chr$(10)
	endif
End Sub
Una vez pegado el código le damos al botón de ejecutar macro:
y cuando nos pregunte seleccionamos la macro llamada MozProfile y damos al botón ejecutar del cuadro de diálogo. El resultado que se muestra es como el de la imagen siguiente:
Se puede apreciar en la imagen que la primera ruta del perfil es la correspondiente al Firefox. Por lo tanto importaremos el certificado digital en ese navegador. Esta acción no la explicaremos en este artículo, pero si no sabes cómo hacerlo te basta con poner en el buscador Google la frase importar certificado digital en Firefox para que te salgan un montón de resultados explicándolo.
También podemos seleccionar la ruta de los certificados a través de la opción del menú Herramientas -> Opciones

Vemos que en la sección LibreOffice -> Seguridad hay una parte que pone Ruta del certificado. Le damos al botón asociado (el que está marcado con una elipse roja) y se nos abrirá un cuadro de diálogo donde podremos seleccionar la ruta de almacenamiento de los certificados entre las que aparecen en la lista:
 

Firmado documentos en LibreOffice

Como ya tenemos instalado nuestro certificado en Firefox podemos empezar a utilizarlo en LibreOffice.
Creamos nuestro documento y, cuando esté listo, lo guardamos. Ahora abrimos el menú Archivo y seleccionamos la opción Firmas digitales. En el submenú que se abre volvemos a seleccionar Firmas digitales... Lo que nos abrirá una ventana en la que se muestra el cuadro de diálogo siguiente:
Y, tal como está señalado en la imagen le damos al botón Firmar documento. Esto nos abrirá el cuadro de diálogo para seleccionar el certificado que previamente habíamos instalado en el Firefox. De entre los certificados que haya en el Firefox, en mi caso es sólo uno, seleccionamos aquel con el que queremos firmar el documento. Damos al botón Firmar y listo, el documento está firmado:

Nota

Podría ocurrir que al firmar mostrara el mensaje de que la firma no se pudo validar. Yo usé un certificado de la FNMT, Fábrica Nacional de Moneda y Timbre, y resulta que en el navegador Firefox, los certificados raíces no tenían marcados los checkbox de la confianza. Basta con marcarlos y volver a reiniciar el LibreOffice para que ya salga el mensaje de que la firma es válida.
 
El documento firmado no se puede modificar sin perder la firma. De esta manera, nos podemos asegurar que el destinatario del documento sabe que procede de nosotros y que no ha sido modificado desde el momento en que se firmó. 
Eso no quiere decir que esté protegido contra escritura. Se puede modificar, pero en ese caso el LibreOffice mostrará un mensaje de que el documento estaba firmado y fue modificado.

Firma de documentos PDF

Además de poder firmar documentos realizados en LibreOffice, ya sea Writer, Calc, Draw o Impress, es posible también firmar documentos en formato PDF que ya existan en nuestro sistema.

Si se fijaron durante el ejemplo anterior, aparte de la opción Firmas digitales... al abrir el submenú Firmas digitales aparecía otra opción que se llamaba Firmar PDF existente

La firma del documento PDF es tan sencilla como seleccionar esa opción y, en el cuadro de diálogo que nos aparece, seleccionar el documento PDF que vamos a firmar. Una vez seleccionado, nos aparece el mismo cuadro de diálogo para escoger el certificado que en el ejemplo anterior. Lo seleccionamos, le damos a Firmar y, listo, el  PDF estará firmado.

Validación de la firma de un documento

A la hora de validar si un documento está firmado y si la firma es válida basta con abrirlo con el programa que se hizo: Writer, Draw, Calc o Impress y se mostrará un mensaje en una barra informando que el documento ha sido firmado digitalmente y si la firma es válida o no.
En la propia barra se muestra un botón que permite al usuario ver las firmas asociadas al documento. Es un atajo para llegar al cuadro de diálogo que ya vimos durante el proceso de firma.
Por otro lado, si lo que queremos validar es la firma de un documento PDF sólo podremos hacerlo utilizando el Draw. El resto sería igual que en los documentos nativos de LibreOffice

Conclusión

Como vimos en este artículo es sumamente sencillo firmar documentos utilizando el LibreOffice. Usa esta función siempre que quieras que la persona que reciba el documento de LibreOffice o PDF sepa que es de tu parte y que no ha sido modificado por nadie desde que lo firmaste. 
La única pega que veo es que, a diferencia de otros programas de firma digital, en el LibreOffice la firma queda embebida dentro del documento sin que se muestre ningún mensaje en él indicando que el documento se encuentra firmado. Pero el texto que se muestra no es la firma, como suele creer mucha gente, por lo que eso no es importante.
Un saludo y hasta el próximo artículo.









Comentarios

Entradas populares de este blog

Atom ha muerto, viva Zed

El día 8 de junio de 2022, Microsoft anunció que a partir del día 31 de diciembre de este mismo año dejaría de dar soporte para el editor de código Atom .  ¿En qué nos afecta esto a nosotros? Bueno, pues si me han seguido en artículos anteriores saben que tras una comparativa de varios IDEs había decidido utilizar Atom para los ejemplos que tuviera que hacer en este blog. Sobre todo los artículos que prepararé para ilustrar el uso de Laravel . Amén de los miles de programadores que actualmente usan Atom  en sus proyectos, claro. Pero, ¿qué editor de código abierto podremos utilizar para sustituir a Atom ? En el mismo comunicado, Microsoft explicaba que el abandono del proyecto Atom  se debía a que querían volcar todos sus esfuerzos en el Visual Studio Code y, por supuesto, recomendó a los usuarios de Atom la utilización del mismo como alternativa natural. No quiero entrar en las bondades o defectos del Visual Studio Code  si quieres elegirlo como tu IDE para desarrollo predeterm

Zed: ahora un editor de código de código abierto

  Zed: ahora un editor de código de código abierto Introducción Como ya les comenté en un artículo anterior  Atom ha muerto, viva ZED , Microsoft dejó de dar soporte para el editor de código Atom en el año 2022 en beneficio del Visual Studio Code . En aquel artículo les comentaba que para mi el sucesor de Atom era Zed pues era un editor que se estaba creando por el mismo grupo de trabajo que creó el Atom . Además de que parecía que iba a seguir con la misma filosofía con la que nació  Atom . El editor Zed, una descripción de sus características Zed es un editor de código desarrollado en Rust que, como deberíamos saber, es un lenguaje de programación de sistemas que se enfoca en la seguridad, el rendimiento y la concurrencia. Pues, como decíamos, Zed acaba de dar el salto a ser de código abierto bajo la licencia GPL v3 . Este cambio no solo representa una nueva era para Zed , sino que también nos dirige a un nuevo mundo de colaboración y desarrollo en el ámbito de la programación.

Gestión de la red usando la línea de comandos (III): gestión DNS

  Introducción En este nuevo artículo de la serie vamos a hablar de la gestión del DNS, Domain Name System. El sistema de resolución de nombres nos permite traducir los nombres de los dominios de Internet en direcciones IP númericas. Más difíciles de recordar para los humanos.  El DNS fue concebido a mediados de los años 80. Hasta esa época, los ordenadores conectados a una red disponían de una dirección numérica, la dirección IP. Pero con el tiempo, cada vez había más ordenadores conectados a las redes. Esto hacía que cada vez fuera más difícil recordar las direcciones IP. Sobre el año 1983, Paul Mockapetris , un informático estadounidense, desarrolló un sistema jerárquico de nombres para identificar a los ordenadores conectados a una red. Y, a mediados de la década, ya se convirtió en un estándar. Pueden consultar más información sobre el sistema DNS consultando el artículo de la Wikipedia: Sistema de nombres de dominio . En este artículo, no vamos a explicar como montar un servidor