Tabla de Contenidos

Manejo de Firma Digital en PHP

Descripción

Este documento muestra como manipular firmas digitales, documentos firmados, evaluarlos, etc

Prerequistos

Conocimiento y quiza  OpenSSL (este viene con todos los linux)

Es importante que este familiarizado conla nomenclatura. Es posible que sea util que lea primero el wiki de entidad de certificacion

Desde PHP

Nos vamos a basar en el documento del gobierno Boliviano que esta super completo  https://tutoriales.adsib.gob.bo/_09/index.html

1. Instalacion

Los requisitos son

- podofo:  LIbreria de manipulacion de pdfs. Excelente, actualizada y estan dentro de los repositorios de Debian.
podofo-sign o pdfsign: Agrega firma digital a la libreria PoDoFo .
- php-pdfsig:  Libreria de PHP para validar firmas: 

La forma en que esta construido es    PoDoFO (libreria) → PoDoFoSign (libreria) → php-pdfsing

1.1. PDFSign Libreria de PDF+ Firma Digital para ADSIB

Esta libreria implementa la funcionalidad de validar una firma digital en PDF. Tambien tiene funcionalidad de firmar y utilizar PKCS#7 para tokens.

PDFSign es el backend de la libreria de PHP ADSIB
Un ejemplo puede ser encontrado en: [ADSIB - Tutorial](https://tutoriales.adsib.gob.bo/_09/index.html)

Para poder utilizar la librería es necesario compilarla, para lo cual hay que seguir los siguientes pasos.

1.1.1. Instalación de dependencias

Debian / Ubuntu

$ sudo apt-get install build-essential
$ sudo apt-get install git libssl-dev libssl1.1

Fedora / RedHat / CentOS / Alma / Rocky


$ sudo dnf groupinstall “Development Tools” “Development Libraries”
$ sudo dnf install git g++ openssl-libs openssl-devel
$ sudo mkdir /usr/local/lib
$ sudo echo /usr/local/lib/ > /etc/ld.so.conf.d/local.conf

En SUSE / OpenSUSE

Esto es lo que deberia igual, pero firmar no funciona por openssl

$ sudo zypper install -t pattern devel_basis
$ sudo zypper install git openssl-1_1 libopenssl1_1 libopenssl-1_1-devel

instale openssl de fuentes y si funciona (https://www.openssl.org/source/)

1.1.2. Instalación de librería libpodofo para gestión de documentos PDF

Puede hacerse desde el repo oficial de Debian / Ubuntu

apt-get install libpodofo-dev libpodofo0.9.6

Fedora / RedHat / CentOS / Alma / Rocky

$ sudo dnf install podofo-devel podofo-libs

En SUSE / OpenSUSE

$ sudo zyyper install libpodofo-devel libpodofo0_9_6

O utilizando los fuentes proveidos por adsib

$ curl https://sistemas.adsib.gob.bo/nextcloud/index.php/s/eMXjic45493Strp/download –output /tmp/libpodofo-dev.deb
$ sudo dpkg -i /tmp/libpodofo-dev.deb
$ sudo apt install -f

1.1.3. Compilación

$ cd php-pdfsig/pdfsig
$ make
$ make install
$ make test

1.1.4. Utilizar la librería

Una vez compilado se generará los archivos pdfsig.so, podofosign.so y podofotoken.so en la carpeta lib, y cuando se instalan para utilizarlos, son copiados a /usr/local/lib para validación de firma digital, firma por software y firma por PKCS#11 respectivamente.

1.2 ADSIB - Validador de firma PHP

La librería para PHP que se describre aquí fue implementada con el propósito de darle a PHP la posibilidad de validar la firma digital en documentos PDF.\\
Un ejemplo puede ser encontrado en: [ADSIB - Tutorial](https://tutoriales.adsib.gob.bo/_09/index.html)

1.2.1. Instalación de dependencias PHP

Debian / Ubuntu

$ sudo apt-get install php7.3-cli php7.3-dev php7.3-json

En SUSE / OpenSUSE

$ sudo zypper install php7-cli php7-devel php7-json php7-openssl

Fedora / RedHat / CentOS / Alma / Rocky

$ sudo dnf install php-cli php-devel php-json

1.2.2. Compilación

Yo tengo una rama propia para descargar

$ git clone https://gitlab.softwarelibre.gob.bo/kasandra/php-pdfsig/
$ cd php-pdfsig

Ajuste el Makefile de acuerdo a su distribucion y el sitio donde estan los includes y las extensiones de PHP

$ make
$ sudo make install
$ make test

1.2.3. Utilizar la librería

Una vez compilado se generará los archivos php_pdfsig.so, php_podofosign.so y php_podofotoken.so en la carpeta lib, para utilizarlos, estos deben copiarse al directorio de librerías de php y agregarlos como extensiones para validación de firma digital, firma por software y firma por PKCS#11 respectivamente.

 

Ejecución

1. Validar


function format($fecha) {
    $year = substr($fecha, 2, 4);
    $month = substr($fecha, 6, 2);
    $day = substr($fecha, 8, 2);
    $hour = substr($fecha, 10, 2);
    $min = substr($fecha, 12, 2);
    $seg = substr($fecha, 14, 2);
    return $year.'-'.$month.'-'.$day.' '.$hour.':'.$min.':'.$seg;
}

function getOID($OID, $ssl) {
    preg_match('/\\/' . $OID  . '=([^\\/]+)/', $ssl, $matches);
    return $matches[1];
}

//extraigo informacion
$infofirma= pdfsig_php($argv[1]);

//Lo convierto json en un arreglo
$json = json_decode($infofirma);

//echo “Nro de firmas: ”.count($json).“\”;

for ($i = 0; $i < count($json); $i++) {
    $certificado=$json[$i]→certificados[0]→certificado;
//    echo “Certificado: ”.$certificado;
    $infocert=openssl_x509_parse($certificado);
//    var_dump($infocert) ;
    echo “Estado: ”.$json[$i]→estadoFirma.“\”;
    echo “Empresa: ”.$infocert['subject']['O'].“\”;
    echo “Firmante: ”.$infocert['subject']['CN'].“\”;
    echo “Cargo: ”.$infocert['subject']['title'].“\”;
    echo “El correo del firmante: ”.$infocert['subject']['emailAddress'].“\”;
    echo “”;
    echo “Direccion del emisor es: ”.$infocert['issuer']['street'].“\”;
    echo “Servicios OCSP: ”.$infocert['extensions']['authorityInfoAccess'].“\”;
    echo “Servicios CRL: ”.$infocert['extensions']['crlDistributionPoints'].“\”;
    echo “”;
    echo “Fecha firmado:”.format($json[$i]→fechaFirma).“\”;
    echo “Fecha vence:”.date(“Y-m-d H:i:s”,$infocert['validTo_time_t']).“\”;
}

?>
 

2. Firmar

<?php
podofosign_php(“prueba.pdf”, “prueba.signed.pdf”, “prueba.p12”, “I234s678”);
?>



-

Referencias

-

FIN


Advertencia

Este documento es privado y es de u so exclusivo de sus autores y de SKINA TECH. Cualquier uso sin una autorización escrita es contra la ley de derechos de autor y de propiedad intelectual, y será motivo de una acción legal.


 

15-Marzo-2006 J.E.Gomez v1.0 Primera version