Firma digital en documentos PDF desde una aplicación en PHP

En este tutorial, se verá la implementación de firma digital en documentos PDF desde una aplicación escrita en PHP. Para este propósito, se utilizará la siguiente librería:

TCPDF desarrollada en PHP, opensource y permite la generación de documentos PDF, actualmente soporta la funcionalidad de adicionar firma digital a los documentos. Para usar la librería se debe seguir los siguientes pasos:

  • Descargar el código funete de sourceforge.- Se debe descargar la librería del siguiente link TCPDF, de manera que pueda ser reutilizado en el proyecto.
  • Desempaquetar y copiar en el directorio del proyecto.- Una vez descargado desempaquetarlo y copiarlo a la carpeta del poryecto en: /var/www/html/firma

En el caso de los archivos PDF, se maneja el contenido por secciones, ya que si comparamos el documento original con el firmado, serán diferentes por el contenido de la firma. Sin embargo el contenido propiamente del documento no cambia.

Por lo anterior, el cálculo del HASH se realiza sobre el contenido del PDF como se explica en el siguiente enlace: PDF

La librería anteriormente descargada permite realizar estas acciones mediante el uso de la función setSignature.

Si no tiene instalado PHP y las dependencias, puede utilizar la siguiente instrucción:

  1. sudo apt-get install apache2 php

Una vez instalado, crear el archivo index.php en la carpeta /var/www/html/firma

  1. sudo nano /var/www/html/firma/index.php

Y dentro del archivo iría más o menos el siguinete código:

  1. <?php
  2. require_once('./tcpdf/tcpdf.php');
  3. $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8', false);
  4. $info = array(
  5. 'Name' => 'TCPDF'
  6. );
  7. $certificate = 'file://'.realpath('./cert.crt');
  8. $primaryKey = 'file://'.realpath('./key.pem');

Como se puede observar en el código anterior, se importa la librería tcpdf, asumiendo que la misma fue copiada en el directorio del proyecto. Se crear un documento pdf en memoria y se establece el path del certificado y llave primaria a utilizarse para firmar el documento.

Lamentablemnete la librería no soporta directamente el formado PKCS#12, sin embargo se puede realizar una covnersión temporal con OpenSSL como se muestra a continuación.

  1. sudo openssl pkcs12 -in token.p12 -nocerts -out /var/www/html/firma/key.pem
  2. sudo openssl pkcs12 -in token.p12 -clcerts -nokeys -out /var/www/html/firma/cert.crt

Con los pasos anteriores en la consola de comandos, se tendrá disponibles el certificado y clave privada en los archivos cert.crt y key.pem. Finalmente agregamos contenido al documento y lo firmamos (continuando en el archivo index.php):

  1. $pdf->AddPage();
  2. $pdf->writeHTML('Este es un <b color="#FF0000">documento firmado digitalmente</b> usando TCPDF', true, 0, true, 0);
  3. $pdf->setSignature($certificate, $primaryKey, '123456', '', 2, $info);
  4. $pdf->Output('example.pdf', 'D');

Si desea descargar el ejemplo puede hacerlo a través del siguiente link: Código de ejemplo

© ADSIB 2019 Bolivia