New question

Question:

Date: 03-03-2016 13:11:55 (In Spanish)

Firma Digital en PHP[Resolved]

Hola amigos, disculpen, alguno de ustedes a trabajado con Firma Digital en PHP?
¿Qué componentes tengo que utilizar?
Tags: Digital Certificate - Digital Signature - Encryption - PHP - PHP Advanced - Question - RSA asymmetric keys - Security Votes: 2 - Answers: 32 - Views: 187 Share on: Google Facebook Twitter LinkedIn Link
 

Answers:

  • Date: 04-03-2016 03:58:30 Hola Diego, interesante tema para meterse de lleno en la criptografía y claves asimétricas RSA.

    Para dar una pequeña introducción al tema del firmado de documentos debemos entender que este tipo de encriptación no se realizar para ocultar los datos, sino para garantizar la identidad del emisor, y esto es posible gracias a las claves asimétricas, las cuales son un par de claves que funcionan de la siguiente forma:


    *Todo lo que se encripte con una clave, solo podrá ser desencriptado con la otra clave (con su par).
    *La clave publica, como su nombre lo indica, es publica y puede ser utilizada por cualquier persona.
    *La clave privada, es privada y solo debe ser conocida por su dueño.
    *La firma digital es generada con la clave privada del emisor y el documento
    *La firma digital puede ser verificada por cualquiera con acceso a la clave publica.


    Basicamente, si tu firmas un documento con una clave privada, yo conociendo tu clave publica podré verificar que ese documento fue firmado por ti. Digamos lo mismo de otra forma, si tu encriptas un documento con una clave privada, ese documento solo podrá ser desencriptado y leido por quien tenga acceso a la clave publica relacionada con tu clave privada, por lo que si tu me envías a mi un texto encriptado con tu clave privada, si yo lo puedo leer (obviamente conociendo tu clave publica) es porque ese documento lo escribiste tu y no fue modificado, de lo contrario no lo podría desencriptar...

    Obviamente hay mucho que saber sobre este tema, los invito a leer la documentación en línea de php.net sobre openssl. Para los fines práctivos, aquí les dejo un ejemplo 100% probado/comentado:

    <?php
    //Datos que se quieren firmar:
    $datos = 'Este texto será firmado. Thanks for your attention :)';
    
    //Se deben crear dos claves aparejadas, una clave pública y otra privada
    //A continuación el array de configuración para la creación del juego de claves
    $configArgs = array(
        'config' => 'C:\xampp5_6_15\php\extras\openssl\openssl.cnf', //<-- esta ruta es necesaria si trabajas con XAMPP
        'private_key_bits' => 2048,
        'private_key_type' => OPENSSL_KEYTYPE_RSA
    );
    $resourceNewKeyPair = openssl_pkey_new($configArgs);
    if (!$resourceNewKeyPair) {
        echo 'Puede que tengas problemas con la ruta indicada en el array de configuración "$configArgs" ';
        echo openssl_error_string(); //en el caso que la función anterior de openssl arrojará algun error, este sería visualizado gracias a esta línea
        exit;
    }
    
    //obtengo del recurso $resourceNewKeyPair la clave publica como un string 
    $details = openssl_pkey_get_details($resourceNewKeyPair);
    $publicKeyPem = $details['key'];
    
    //obtengo la clave privada como string dentro de la variable $privateKeyPem (la cual es pasada por referencia)
    if (!openssl_pkey_export($resourceNewKeyPair, $privateKeyPem, NULL, $configArgs)) {
        echo openssl_error_string(); //en el caso que la función anterior de openssl arrojará algun error, este sería visualizado gracias a esta línea
        exit;
    }
    
    //guardo la clave publica y privada en disco:
    file_put_contents('private_key.pem', $privateKeyPem);
    file_put_contents('public_key.pem', $publicKeyPem);
    
    //si bien ya tengo cargado el string de la clave privada, lo voy a buscar a disco para verificar que el archivo private_key.pem haya sido correctamente generado:
    $privateKeyPem = file_get_contents('private_key.pem');
    
    //obtengo la clave privada como resource desde el string
    $resourcePrivateKey = openssl_get_privatekey($privateKeyPem);
    
    //crear la firma dentro de la variable $firma (la cual es pasada por referencia)
    if (!openssl_sign($datos, $firma, $resourcePrivateKey, OPENSSL_ALGO_SHA256)) {
        echo openssl_error_string(); //en el caso que la función anterior de openssl arrojará algun error, este sería visualizado gracias a esta línea
        exit;
    }
    
    // guardar la firma en disco:
    file_put_contents('signature.dat', $firma);
    
    // comprobar la firma
    if (openssl_verify($datos, $firma, $publicKeyPem, 'sha256WithRSAEncryption') === 1) {
        echo 'la firma es valida y los datos son confiables';
    } else {
        echo 'la firma es invalida y/o los datos fueron alterados';
    }
    


    Espero que mi respuesta sea de ayuda.

    Saludos y buen código!
      Votes: 11 - Link answer
     
  • Date: 07-03-2016 05:17:46 HOLA FERNANDO MOSQUERA TE EXPLICO MI CASO.
    LO QUE PASA ES QUE NOSOTROS EMOS COMPRADO UNAS FIRMAS ELECTRONICAS PERO ELLOS NOS AN DADO SOLO LA FIRMA Y PARA FIRMAR EN PDF DEFRENTE LO QUE NOSOTROS QUEREMOS ES QUE SI ESAS FIRMA QUE NOS AN DADO SE PUEDE TRABAJAR DIRECTAMENTE CON EL SISTEMA QUE ESTA REALIZADO EN PHP NOS DIERON DOS FORMATOS UNO EN .PFX Y EL OTRO EN .CRT Y LA VERDAD QUE NO E TRABAJADO NUNCA CON FIRMAS DIGITALES Y NO HAY MUCHA INFORMACIÓN EN LA WEB NO SE SI ME PODRIAS ORIENTAR SOBRE EL TEMA .
    GRACIAS.
      Votes: 0 - Link answer
     
  • Date: 07-03-2016 07:28:44 Hola Diego, disculpa pero debo pedirte que escribas en minúsculas, en la dinámica de la comunicación en Internet, por lo general un texto en mayúsculas es considerado hablar fuerte, gritar, etc.... y no esta bien visto por estos parajes :)

    Volviendo al tema del certificado que te han dado, estimo que el archivo .CRT es un certificado X.509, de ser así tienes una serie de funciones nativas de PHP que te permitirán trabajar con él.

    Aquí te dejo el enlace a la documentación oficial de la función para hacer la lectura de ese tipo de certificado: http://php.net/manual/es/function.openssl-x509-read.php

    Todavía no me queda claro que es lo que quieres hacer con el certificado, tal vez:
    * Firmar con el certificado archivos/emails/otros...?
    * Crear una comunicación segura SSL/TLS entre el cliente web y con tu servidor?

    Sobre tu último comentario no comprendo a que te refieres cuando dices:
    "PARA FIRMAR EN PDF DEFRENTE": tal vez quieres indicar que ya puedes firmas diferentes PDF pero no usarlo en un sistema PHP....?
    "LO QUE NOSOTROS QUEREMOS ES QUE SI ESAS FIRMA QUE NOS AN DADO SE PUEDE TRABAJAR DIRECTAMENTE CON EL SISTEMA QUE ESTA REALIZADO EN PHP": no se a que te refieres con "TRABAJAR DIRECTAMENTE" y no se cual es el "SISTEMA QUE ESTA REALIZADO EN PHP" por lo que no podrés ayudarte sin mayor detalle, aunque puedo asumir que te refieres a utilizar el certificado para crear una comunicación segura SSL/TLS entre el cliente web y tu servidor, no? espero puedas aportar mayor detalle.

    Saludos!
      Votes: 5 - Link answer
     
  • Date: 07-03-2016 11:30:10 Hola Fernando,bueno disculpame por el tema de utilizar mayusculas no volvera a pasar,
    Y sobre esto que me escribistes que no te quedaba claro despejo tus dudas.

    Todavía no me queda claro que es lo que quieres hacer con el certificado, tal vez:
    * Firmar con el certificado archivos/emails/otros...?
    * Crear una comunicación segura SSL/TLS entre el cliente web y con tu servidor?

    Mira el sistema que estoy desarrollando trabaja en lo que es medicina una clínica ocupacional lo que queremos hacer con las firmas digitales es por decir un ejemplo.
    Que el examen de la persona x salga firmada ya por decir que cuando el doctor suba sus resultados de medicina la firma ya se guarde, decir que el laboratorista suba el examen de laboratorio se guarde ya firmado y al momento de cerrar el examen con todos los exámenes x que paso salga la firma de todo los doctores que paso eso es la idea que tengo y de echo ps que la firma tiene que salir en documento pdf.

    Y esto es lo que te decia sobre firmar diferente?.
    Es decir que abriendo nada mas nitro pdf puedo firmar digital mente pero solo una hoja por hoja por eso es el tema que necesito mas información para poder desarrollarlo desde php y así mejorar tiempo en el trabajo.

    Gracias
    Y mas bien no se si me podrias pasar tu cuenta de facebook para conversar mejor del tema :)

    Gracias.
      Votes: 0 - Link answer
     
  • Date: 07-03-2016 13:51:21 Bien, si lo que quieres es firmar documentos PDF, revisa la librería TCPDF que permite generar documentos PDF firmados.

    Aquí te dejo el enlace a la página oficial de la librería: http://www.tcpdf.org/

    Aquí el enlace al repositorio de sourceforge.net donde podrás descargar la última versión de la librería: https://sourceforge.net/projects/tcpdf/files/

    También un ejemplo de como firmar un PDF desde PHP con un certificado CRT:
     <?php
    //============================================================+
    // File name   : example_052.php
    // Begin       : 2009-05-07
    // Last Update : 2013-05-14
    //
    // Description : Example 052 for TCPDF class
    //               Certification Signature (experimental)
    //
    // Author: Nicola Asuni
    //
    // (c) Copyright:
    //               Nicola Asuni
    //               Tecnick.com LTD
    //               www.tecnick.com
    //               info@tecnick.com
    //============================================================+
    
    /**
     * Creates an example PDF TEST document using TCPDF
     * @package com.tecnick.tcpdf
     * @abstract TCPDF - Example: Certification Signature (experimental)
     * @author Nicola Asuni
     * @since 2009-05-07
     */
    
    // Include the main TCPDF library (search for installation path).
    require_once('tcpdf_include.php');
    
    // create new PDF document
    $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);
    
    // set document information
    $pdf->SetCreator(PDF_CREATOR);
    $pdf->SetAuthor('Nicola Asuni');
    $pdf->SetTitle('TCPDF Example 052');
    $pdf->SetSubject('TCPDF Tutorial');
    $pdf->SetKeywords('TCPDF, PDF, example, test, guide');
    
    // set default header data
    $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 052', PDF_HEADER_STRING);
    
    // set header and footer fonts
    $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
    $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));
    
    // set default monospaced font
    $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);
    
    // set margins
    $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
    $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
    $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);
    
    // set auto page breaks
    $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);
    
    // set image scale factor
    $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);
    
    // set some language-dependent strings (optional)
    if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
        require_once(dirname(__FILE__).'/lang/eng.php');
        $pdf->setLanguageArray($l);
    }
    
    // ---------------------------------------------------------
    
    /*
    NOTES:
     - To create self-signed signature: openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt
     - To export crt to p12: openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12
     - To convert pfx certificate to pem: openssl pkcs12 -in tcpdf.pfx -out tcpdf.crt -nodes
    */
    
    // set certificate file
    $certificate = 'file://data/cert/tcpdf.crt';
    
    // set additional information
    $info = array(
        'Name' => 'TCPDF',
        'Location' => 'Office',
        'Reason' => 'Testing TCPDF',
        'ContactInfo' => 'http://www.tcpdf.org',
        );
    
    // set document signature
    $pdf->setSignature($certificate, $certificate, 'tcpdfdemo', '', 2, $info);
    
    // set font
    $pdf->SetFont('helvetica', '', 12);
    
    // add a page
    $pdf->AddPage();
    
    // print a line of text
    $text = 'This is a <b color="#FF0000">digitally signed document</b> using the default (example) <b>tcpdf.crt</b> certificate.<br />To validate this signature you have to load the <b color="#006600">tcpdf.fdf</b> on the Arobat Reader to add the certificate to <i>List of Trusted Identities</i>.<br /><br />For more information check the source code of this example and the source code documentation for the <i>setSignature()</i> method.<br /><br /><a href="http://www.tcpdf.org">www.tcpdf.org</a>';
    $pdf->writeHTML($text, true, 0, true, 0);
    
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // *** set signature appearance ***
    
    // create content for signature (image and/or text)
    $pdf->Image('images/tcpdf_signature.png', 180, 60, 15, 15, 'PNG');
    
    // define active area for signature appearance
    $pdf->setSignatureAppearance(180, 60, 15, 15);
    
    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    
    // *** set an empty signature appearance ***
    $pdf->addEmptySignatureAppearance(180, 80, 15, 15);
    
    // ---------------------------------------------------------
    
    //Close and output PDF document
    $pdf->Output('example_052.pdf', 'D');
    
    //============================================================+
    // END OF FILE
    //============================================================+
    
    


    Demo del PDF firmado: http://www.tcpdf.org/examples/example_052.pdf

    Espero que mi respuesta te sea de ayuda.

    Saludos!
      Votes: 6 - Link answer
     
  • Date: 07-03-2016 13:59:49 Aquí otro ejemplo de como firmar un documento PDF pero con la librería FPDF:

    <?php
    require_once('fpdf.php');
    
    // create an instance of FPDF
    $pdf = new fpdf();
    $pdf->AddPage();
    $pdf->SetFont('Arial', 'B', 14);
    
    // let's write some dynamic content
    $text = 'This document is created with FPDF on '
          . date('r')
          . ' and digital signed with the SetaPDF-Signer component.';
    $pdf->MultiCell(0, 8, $text);
    
    // Output the PDF document to a string
    $fpdf = $pdf->Output('', 'S');
    
    require_once("library/SetaPDF/Autoload.php");
    
    // create a Http writer
    $writer = new SetaPDF_Core_Writer_Http("fpdf-sign-demo.pdf", true);
    // load document by filename
    $document = SetaPDF_Core_Document::loadByString($fpdf, $writer);
    
    // let's prepare the temporary file writer:
    SetaPDF_Core_Writer_TempFile::setTempDir("_tmp/");
    
    // create a signer instance for the document
    $signer = new SetaPDF_Signer($document);
    
    // set some signature properties
    $signer->setReason('Demo with FPDF');
    $signer->setLocation('setasign.com');
    
    // ccreate an OpenSSL module instance
    $module = new SetaPDF_Signer_Signature_Module_OpenSsl();
    // set the sign certificate
    $module->setCertificate(file_get_contents("certificate.pem"));
    // set the private key for the sign certificate
    $module->setPrivateKey(array(file_get_contents("private-key.pem"),"password"));
    
    // sign/certify the document
    $signer->sign($module);
    


    Observa que esta librería no utilizar directamente el certificado CRT, sino un PEM, por lo que deberás someter tu certificado a una conversión a PEM, lo pudes hacer con OPENSSL, aquí un ejemplo del comando que deberías utilizar para hacerlo:
    openssl x509 -in mycert.crt -out mycert.pem -outform PEM
    


    Saludos y buen código!
      Votes: 4 - Link answer
     
  • Date: 08-07-2016 22:30:09 Amigos alguien tiene algún ejemplo de como seria firmar un archivo xml firmado con una .p12 estoy trabajando en laravel. cualquier ejemplo me servira.   Votes: 0 - Link answer
     
  • Date: 13-07-2016 18:18:29 Gracias Fernando me ha sido de gran ayuda :) este foro es de los mejor :)   Votes: 2 - Link answer
     
  • Date: 23-08-2016 06:52:31 Sr. Fernando Mosquera:

    Intente ejecutar tu script pero:

    1. Toco descargar e instalar la librería de evaluación SetaPDF.
    2. Al correr el ejemplo, me pidió instalar ioncube.
    3. Saco Error y aunque lo trabaje un día completo no conseguí nada.....

    Por favor me podrías enviar los script completos a mi email que esta codificado:

    base64 utf-8 (Z2lvdmE5MDBAaG90bWFpbC5jb20=)

    URL para Decodificar: https://www.base64decode.org

    Muchas gracias de antemano.

    Att.
    Giovanni
      Votes: 1 - Link answer
     
  • Date: 18-01-2017 10:28:37 Fernando, vi la libreria tcpdf, pero tengo una duda, es posible usar esos metodos para firmar un archivo php ya generado? es decir, tengo un archivo pdf, y quiero con PHP agregarle la firma digital, es posible?   Votes: 1 - Link answer
     
  • Date: 19-01-2017 08:55:06 Estimados Giovanni y Nicolas, aquí mis respuestas:

    Giovanni, puede que el código de ejemplo requierá alguna dependencia, pero el mismo sistema te tiene que dar una advertencia o error informando. Si te da algún mensaje de error que no puedes resolver comentalo aquí y veremos de resolverlo entre todos, no tengo más, sino gustoso te lo envío al email (tengo pendiente hacer un tutorial con esta información un poco mas depurada).

    Nicolas, claro, deberás primero cargar el pdf existente por medio del import propuesto por la librería, aquí la documentación: https://tcpdf.org/docs/source_docs/classTCPDF__IMPORT/

    Saludos a todos y buen código!
      Votes: 2 - Link answer
     
  • Date: 19-01-2017 10:53:39 Muchas gracias por la pronta respuesta Fernando, implemento el método importPDF de la clase tcpdf_import pero cuando le doy al pdf->output, imprime solo data sin sentido, y como texto, ni si quiera genera el pdf, no he conseguido algún ejemplo de como implementarlo.

    Si tienes un ejemplo de como implementar la function importPDF($filename) de la clase tcpdf_import, y puedes compartirla, lo agradecería mucho.

    Saludos.
      Votes: 1 - Link answer
     
  • Date: 19-01-2017 12:16:41 Hola Nicolas, me puse ha realizar una demo para presentarte un ejemplo (ya que no es tan complejo de hacer) y veo que el método importPDF de la clase TCPDF_IMPORT no esta terminado, quedo comentado un print_r con //DEBUG .....

    Veamos el código de la clase TCPDF_IMPORT:
    <?php
    //============================================================+
    // File name   : tcpdf_import.php
    // Version     : 1.0.001
    // Begin       : 2011-05-23
    // Last Update : 2013-09-17
    // Author      : Nicola Asuni - Tecnick.com LTD - www.tecnick.com - info@tecnick.com
    // License     : GNU-LGPL v3 (http://www.gnu.org/copyleft/lesser.html)
    // -------------------------------------------------------------------
    // Copyright (C) 2011-2013 Nicola Asuni - Tecnick.com LTD
    //
    // This file is part of TCPDF software library.
    //
    // TCPDF is free software: you can redistribute it and/or modify it
    // under the terms of the GNU Lesser General Public License as
    // published by the Free Software Foundation, either version 3 of the
    // License, or (at your option) any later version.
    //
    // TCPDF is distributed in the hope that it will be useful, but
    // WITHOUT ANY WARRANTY; without even the implied warranty of
    // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    // See the GNU Lesser General Public License for more details.
    //
    // You should have received a copy of the License
    // along with TCPDF. If not, see
    // <http://www.tecnick.com/pagefiles/tcpdf/LICENSE.TXT>.
    //
    // See LICENSE.TXT file for more information.
    // -------------------------------------------------------------------
    //
    // Description : This is a PHP class extension of the TCPDF library to
    //               import existing PDF documents.
    //
    //============================================================+
    
    /**
     * @file
     * !!! THIS CLASS IS UNDER DEVELOPMENT !!!
     * This is a PHP class extension of the TCPDF (http://www.tcpdf.org) library to import existing PDF documents.<br>
     * @package com.tecnick.tcpdf
     * @author Nicola Asuni
     * @version 1.0.001
     */
    
    // include the TCPDF class
    require_once(dirname(__FILE__).'/tcpdf.php');
    // include PDF parser class
    require_once(dirname(__FILE__).'/tcpdf_parser.php');
    
    /**
     * @class TCPDF_IMPORT
     * !!! THIS CLASS IS UNDER DEVELOPMENT !!!
     * PHP class extension of the TCPDF (http://www.tcpdf.org) library to import existing PDF documents.<br>
     * @package com.tecnick.tcpdf
     * @brief PHP class extension of the TCPDF library to import existing PDF documents.
     * @version 1.0.001
     * @author Nicola Asuni - info@tecnick.com
     */
    class TCPDF_IMPORT extends TCPDF {
    
    	/**
    	 * Import an existing PDF document
    	 * @param $filename (string) Filename of the PDF document to import.
    	 * @return true in case of success, false otherwise
    	 * @public
    	 * @since 1.0.000 (2011-05-24)
    	 */
    	public function importPDF($filename) {
    		// load document
    		$rawdata = file_get_contents($filename);
    		if ($rawdata === false) {
    			$this->Error('Unable to get the content of the file: '.$filename);
    		}
    		// configuration parameters for parser
    		$cfg = array(
    			'die_for_errors' => false,
    			'ignore_filter_decoding_errors' => true,
    			'ignore_missing_filter_decoders' => true,
    		);
    		try {
    			// parse PDF data
    			$pdf = new TCPDF_PARSER($rawdata, $cfg);
    		} catch (Exception $e) {
    			die($e->getMessage());
    		}
    		// get the parsed data
    		$data = $pdf->getParsedData();
    		// release some memory
    		unset($rawdata);
    
    		// ...
    
    
    		print_r($data); // DEBUG
    
    
    		unset($pdf);
    	}
    
    } // END OF CLASS
    
    //============================================================+
    // END OF FILE
    //============================================================+
    

    podras observar en la linea 94 el print_r($data); // DEBUG, es por esto que te salen todos simbolos en pantalla.....

    Por lo que he podido ver, la forma para iniciar con un pdf ya existente es usar la librería tcpdf en combinación con fpdi

    Aquí puedes encontrar la librería fpdi: https://www.setasign.com/products/fpdi/downloads/

    Aquí un ejemplo de uso, lo he probado y trabaja ok:
    <?php
    require_once(dirname(__FILE__).'/lib/TCPDF-master/tcpdf_import.php');
    require_once(dirname(__FILE__).'/lib/FPDI-1.6.1/fpdi.php');
    
    $pdf = new FPDI();
    
    $pageCount = $pdf->setSourceFile(dirname(__FILE__).'/prueba.pdf');
    for ($i = 1; $i <= $pageCount; $i++) {
        $tplIdx = $pdf->importPage($i, '/MediaBox');
        $pdf->AddPage();
        $pdf->useTemplate($tplIdx);
    }
    
    $pdf->Output();
    ?>


    Saludos y buen código!
      Votes: 2 - Link answer
     
  • Date: 20-01-2017 02:53:21 Muchas gracias Fernando, hice la prueba y funciono perfectamente, muchas gracias.

    Saludos.
      Votes: 2 - Link answer
     
  • Date: 24-04-2017 04:58:27 Hola Fernando, espero te encuentres bien.

    Quería consultarte ya que hasta ahora en este post es donde mas ayuda conseguí respecto a las firmas digitales, si has realizado firmas digitales a pdf mediante tokens, de firma electrónica avanzada, mi problema es como hacer para sacar el certificado del token (pidiendo la contraseña requerida del firmante), para luego firmar el pdf (como se explico en este mismo post, ya lo sabría hacer), el problema es sacar el certificado del token. No se si me explique o redunde mucho, quedo atento a cualquier respuesta y muchas gracias de antemano.
      Votes: 1 - Link answer
     
  • Date: 24-04-2017 08:11:01 Hola Nicolas, no se a que te refieres con "token". Debe haber alguna especificación y/o nomenclatura técnica más especifica para el dicho "token", tal vez es un certificado cifrado con algún algoritmo... no se... quien te da el "token" deberá darte más información al respecto.

    Saludos!
      Votes: 0 - Link answer
     
  • Date: 24-04-2017 08:55:14 Es como un pendrive pero obviamente el equipo no lo reconoce como dispositivo usb, ese certificado "token" tiene su driver y se instala en el pc, si quiero firmar digitalmente un pdf con adobe reader, puedo, lo reconoce, escogo la firma, me pide una clave y lo firmo, ahora quiero hacer eso pero con php, y preguntaba si habias tenido la necesidad de hacer algo parecido, tengo que buscar la forma de rescatar el certificado del "token" conectado al equipo y que pida la contraseña para poder firmarlo en el php directamente.   Votes: 0 - Link answer
     
  • Date: 28-09-2017 06:59:04 Estimados, yo quiero hacer algo parecido pero tengo problemas en entender el asunto, les explico...

    Tengo un documento generado con fpdf en php, hasta ahí voy bien... ahora, la firma digital esta contratada con una empresa llamada e-sign...

    Ellos me exigen que les mande el pdf codificado a traves de un web service y el documento lo tengo que enviar tantas veces tenga firmas por ejemplo, un contrato lo debo enviar 3 veces (firma del empleado, del empleador y de recursos humanos)...

    Ahora, no entiendo como enviarlo esas tres veces y como, despues de los tres envios voy a poder rescatar/bajar/imprimir/lo que sea el documento pdf ya firmado...

    Estoy enredadisimo, agradeceria cualquier ayuda o guia al respecto (soy nuevo en el mundo php).

    Saludos cordiales y gracias de antemano...
      Votes: 0 - Link answer
     
  • Date: 18-10-2017 11:37:16 Hola amigos alguien tiene algún ejemplo de como seria firmar un archivo xml firmado con una firma.p12 estoy trabajando en laravel.   Votes: 0 - Link answer
     
  • Date: 27-10-2017 03:39:54 Hola,

    Genial los ejemplos y la explicación de las firmas, me ha despejado todas las dudas, excelente trabajo Fernando Mosquera.

    Saludos
      Votes: 0 - Link answer
     
  • Date: 24-11-2017 13:11:01 buenas tardes, quisiera saber si es posible generar certificados propios a través de php y generar las llaves para entregarlas a los clientes y que firmen los documentos con esas llaves a través del sistema y validar la legalidad de la misma.

    Gracias.
      Votes: 0 - Link answer
     
  • Date: 26-12-2017 09:53:44 Fernando un saludo, estoy realizando dos facturaciones electronicas Chile y Costa Rica, tengo una pregunta en referencia de Costa Rica, estamos trancados en los signature value de la firma digital, que pasa estamos adivinando para saber cuales son las partes que van encriptada desde y hasta cuales nodos la documentacion de Hacienda que es el ente fiscal es bastante mala y bueno no explica bien solo que es una firma Xades - EPES si tienes alguna documentacion buena a detalle donde podamos validar nodo a nodo lo que va y como hacerlo te lo agradeceria   Votes: 0 - Link answer
     
  • Date: 26-01-2018 08:57:53 Hola Fernando yo tengo un problema similar a este, estoy realizando una firma electronica para un sistema penal, a que me refiero, pues que generare mediante php un documento pdf que incluya la firma electronica, el trabajo de la firma electronica será que si dicho sujeto ha sido puesto en libertad pero se encuentra en una zona especifica y las oficinas centrales para que le den su liberación se encuentran a una distancia x, el sujeto ya no deba presentarse de manera fisica en la oficina central sino solo pniendo su clave publica a traves de su firma electronica el sistema debe inmediatamente darle su liberación, además si ha sido liberado de un solo cargo pero cuenta con n cantidad de denuncias, al momento de ingresar la firma electronica esta debe darle su liberación pero a su vez inmediatamente asignarle un juicio para su otro cargo (en caso de ser hayado culpable).   Votes: 0 - Link answer
     
  • Date: 06-02-2018 16:19:38 Hola :) estoy desarrollando una aplicacion para un estudio juridico y uno de los requerimientos es implementar una estacion de trabajo para firmas digitales, en el formulario en donde se registraran todos los clientes quienes llevaran un proceso judicial y que tienen que firmar con el mouse y esa firma se integre en una base de datos para que luego pueda implementarse en un documento Word para que luego sea impreso. :) aun aporte de como podria desarrollar lo de la firma :D   Votes: 0 - Link answer
     
  • Date: 12-02-2018 04:50:07 Hola, estoy implementando código para la firma digital desde php, estoy probando con el código que has compartido (Fernando) con la libreria tcpdf, pero algo debo hacer mal, tengo un certificado .crt pero al ejecutar el ejemplo me sale el error:
    Warning: openssl_pkcs7_sign(): error getting private key
    y me preguntaba si aquí donde se hace la llamada para hacer la firma
    $pdf->setSignature($certificate, $certificate, 'tcpdfdemo', '', 2, $info);

    donde dice 'tcpdfdemo' es el password de la firma??
    Gracias por tu ayuda.
      Votes: 0 - Link answer
     
  • Date: 21-11-2018 11:35:04 buenas tardes, tiene un ejemplo de como firmar con un certificado .cer y trabajando con la librería tcpdf?   Votes: 0 - Link answer
     
  • Date: 12-03-2019 14:05:54 Aquí dejo ejemplo con .cer

    <?php
    //============================================================+
    // File name : example_052.php
    // Begin : 2009-05-07
    // Last Update : 2013-05-14
    //
    // Description : Example 052 for TCPDF class
    // Certification Signature (experimental)
    //
    // Author: Nicola Asuni
    //
    // (c) Copyright:
    // Nicola Asuni
    // Tecnick.com LTD
    // www.tecnick.com
    // info@tecnick.com
    //============================================================+

    /**
    * Creates an example PDF TEST document using TCPDF
    * @package com.tecnick.tcpdf
    * @abstract TCPDF - Example: Certification Signature (experimental)
    * @author Nicola Asuni
    * @since 2009-05-07
    */

    // Include the main TCPDF library (search for installation path).
    require_once('tcpdf_include.php');

    // create new PDF document
    $pdf = new TCPDF(PDF_PAGE_ORIENTATION, PDF_UNIT, PDF_PAGE_FORMAT, true, 'UTF-8', false);

    // set document information
    $pdf->SetCreator(PDF_CREATOR);
    $pdf->SetAuthor('Nicola Asuni');
    $pdf->SetTitle('TCPDF Example 052');
    $pdf->SetSubject('TCPDF Tutorial');
    $pdf->SetKeywords('TCPDF, PDF, example, test, guide');

    // set default header data
    $pdf->SetHeaderData(PDF_HEADER_LOGO, PDF_HEADER_LOGO_WIDTH, PDF_HEADER_TITLE.' 052', PDF_HEADER_STRING);

    // set header and footer fonts
    $pdf->setHeaderFont(Array(PDF_FONT_NAME_MAIN, '', PDF_FONT_SIZE_MAIN));
    $pdf->setFooterFont(Array(PDF_FONT_NAME_DATA, '', PDF_FONT_SIZE_DATA));

    // set default monospaced font
    $pdf->SetDefaultMonospacedFont(PDF_FONT_MONOSPACED);

    // set margins
    $pdf->SetMargins(PDF_MARGIN_LEFT, PDF_MARGIN_TOP, PDF_MARGIN_RIGHT);
    $pdf->SetHeaderMargin(PDF_MARGIN_HEADER);
    $pdf->SetFooterMargin(PDF_MARGIN_FOOTER);

    // set auto page breaks
    $pdf->SetAutoPageBreak(TRUE, PDF_MARGIN_BOTTOM);

    // set image scale factor
    $pdf->setImageScale(PDF_IMAGE_SCALE_RATIO);

    // set some language-dependent strings (optional)
    /*if (@file_exists(dirname(__FILE__).'/lang/eng.php')) {
    require_once(dirname(__FILE__).'/lang/eng.php');
    $pdf->setLanguageArray($l);
    }*/

    // ---------------------------------------------------------

    /*
    NOTES:
    - To create self-signed signature: openssl req -x509 -nodes -days 365000 -newkey rsa:1024 -keyout tcpdf.crt -out tcpdf.crt
    - To export crt to p12: openssl pkcs12 -export -in tcpdf.crt -out tcpdf.p12
    - To convert pfx certificate to pem: openssl pkcs12 -in tcpdf.pfx -out tcpdf.crt -nodes
    */

    // set certificate file
    //$certificate = 'file://data/cert/tcpdf.crt';
    $file='CERTIFICADO.cer';
    $clave = 'clave';

    // set additional information
    $info = array(
    'Name' => 'TCPDF',
    'Location' => 'Office',
    'Reason' => 'Testing TCPDF',
    'ContactInfo' => 'http://www.tcpdf.org',
    );

    // set document signature
    //echo realpath('data/cert/tcpdf.crt');

    $pdf->setSignature('file://'.realpath($file), 'file://'.realpath($file), $clave, '', 2, $info);

    // set font
    $pdf->SetFont('helvetica', '', 12);

    // add a page
    $pdf->AddPage();

    // print a line of text
    $text = 'This is a <b color="#FF0000">digitally signed document</b> using the default (example) <b>tcpdf.crt</b> certificate.<br />To validate this signature you have to load the <b color="#006600">tcpdf.fdf</b> on the Arobat Reader to add the certificate to <i>List of Trusted Identities</i>.<br /><br />For more information check the source code of this example and the source code documentation for the <i>setSignature()</i> method.<br /><br /><a href="http://www.tcpdf.org">www.tcpdf.org</a> Sotil Yarasca Quispe';
    $pdf->writeHTML($text, true, 0, true, 0);

    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    // *** set signature appearance ***

    // create content for signature (image and/or text)
    $pdf->Image('images/tcpdf_signature.png', 180, 60, 15, 15, 'PNG');

    // define active area for signature appearance
    $pdf->setSignatureAppearance(180, 60, 15, 15);

    // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    // *** set an empty signature appearance ***
    //$pdf->addEmptySignatureAppearance(180, 80, 15, 15);

    // ---------------------------------------------------------

    //Close and output PDF document
    $pdf->Output('archivo.pdf', 'D');

    //============================================================+
    // END OF FILE
    //============================================================+
      Votes: 0 - Link answer
     
  • Date: 12-03-2019 14:10:34 Ya he generado archivos .pdf con firma digital, ahora lo que me han pedido es que se verifique la firma del archivo pdf. parecido a esto Click . Alguien a implementado y como ?   Votes: 0 - Link answer
     
  • Date: 06-03-2020 03:34:15 Prueba este tutorial PHP   Votes: 0 - Link answer
     
  • Date: 23-07-2020 07:42:24 alguien pudo realizar la firma de documentos con token(usb con los certificados) electronico con tcpdf
    una ayuda
      Votes: 1 - Link answer
     
  • Date: 29-12-2021 07:23:39 Alguien pudo realizar el procedimiento de firmar un documento PDF con php?
    La idea es utilizar una firma digital almacenada en un token criptográfico e imitar las funcionalidades de aplicaciones como XolidoSign pero desde la web con PHP
      Votes: 0 - Link answer
     
  • Date: 24-07-2022 11:29:41 Manuel Yañez. Buenas tardes comunidad PHP, respondiendo a tu pregunta PHP no tiene modulos para firmar directamente con un hardware SmartCard Reader o USB Token igual (Pkcs11) firmas de dispositivos criptográficos asi como las firmas instaladas a travez de Windows KeyStore. en Java existen varios módulos para ello pero al igual que ustedes no gusto de java. en cambio en C# existen infinidad de soluciones pero si deseas hacerlo netamente en PHP, la solución que recomiendo profesionalmente es integrar el aplicativo con un firmador onDemmand como Watana (mi favorito), ReFirma PCX invoker (esto es con convenio institucional y muy lento) el tercero es usar Bit4Id de 4Identity es europeo y muy bueno es el mas limpio y soporta Pkcs11, Pkcs12 y KeyStores sin ningún problema, únicamente requiere estudiar su manual de integración con cualquier aplicativo web, pero ojo todos estos softwares funcionan sobre Win para linux no conozco firmadores middlewares integrables.

    El proceso es simple.
    1. Descargar el middleware cliente.
    2. Completar la URL o Form de invocación (el cliente se encarga de leer los argumentos)
    3. Establecer la ruta del PDF (http o https), logo, posicion de firma x, y, etc.
    4. El cliente descarga en la PC el PDF del servidor o direccion URL y demas datos
    5. Procede a desplegar la lista de certficados instalados incuidos los Pkcs11
    7. Pide le PIN o contraseña de seguridad
    8. Firma
    9. Envia el resultados una direccion URL enviada en los argumentos.
    10. Ejecuta un WebHook del servidor para que avise que llegó y procesar alguna acción.
    11. Te tomas un buen café o cerveza y listo.

    Firmar directamente en PHP con TCPDF solo se puede hacer una vez y su firma se corrompe cuando agregas otra firma con otro firmador lo cual hace inútil el PDF firmado. el mejor el SetaPDF pero es de pago, al igual que LibPDF solo esos firmadores no corrompen el PDF y permiten seguir firmando (pero ambos son de pago a 800$ minimo), los otros tcpdf, ipdf, fpdf los he probado todos son muy básicos para hacer pruebas no para producción (perdonen la franqueza) por ahora uso una solución hecha en C# para firmar y envio y recepciono el PHP el PDF firmado uso iText7 que no corrompe las firmas previas y permite seguir agregando mas firmas.

    Pero resumiendo te recomiendo usar un Middleware integrable que es la mejor solución, además de que existe la seguridad de que la firma sea realmente de quien dice firmarlo. Suerte colega.
      Votes: 0 - Link answer
     
To actively participate in the community first must authenticate, enter the system.Sign In