====== 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 [[egroupware/index.php?menuaction=wiki.wiki_ui.view&page=Entidad+de+certificacion|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\\ \\ - [[http://podofo.sourceforge.net/about.html|podofo]]:  LIbreria de manipulacion de pdfs. Excelente, actualizada y estan dentro de los repositorios de Debian.\\ - [[https://gitlab.softwarelibre.gob.bo/adsib/php-pdfsig|podofo-sign]] o pdfsign: Agrega firma digital a la libreria PoDoFo .\\ - [[https://gitlab.softwarelibre.gob.bo/adsib/php-pdfsig|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 ==== \\ \\ \\ \\ - ===== 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