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