gratis firma descargar crear php pdf digital-signature pkcs#7

descargar - ¿Cómo recuperar información de firma digital desde PDF con PHP?



firma digital pdf (2)

Bueno, es complicado (yo diría que incluso imposible, pero quién sabe) lograr esto solo con PHP.

Al principio, lea el artículo sobre la firma digital en Adobe PDF

En segundo lugar, después de leer esto, sabrá que la firma se almacena entre los bytes byc según el indicador / ByteRange [abcd]

Tercero, podemos extraer byc del documento y luego extraer la firma (la guía dice que será un objeto PKCS7 # hexadecodificado).

<?php $content = file_get_contents(''test.pdf''); $regexp = ''#ByteRange/[/s*(/d+) (/d+) (/d+)#''; // subexpressions are used to extract b and c $result = []; preg_match_all($regexp, $content, $result); // $result[2][0] and $result[3][0] are b and c if (isset($result[2]) && isset($result[3]) && isset($result[2][0]) && isset($result[3][0])) { $start = $result[2][0]; $end = $result[3][0]; if ($stream = fopen(''test.pdf'', ''rb'')) { $signature = stream_get_contents($stream, $end - $start - 2, $start + 1); // because we need to exclude < and > from start and end fclose($stream); } file_put_contents(''signature.pkcs7'', hex2bin($signature)); }

En adelante, después del tercer paso tenemos el objeto PKCS # 7 en el archivo signature.pkcs7. Desafortunadamente, no conozco métodos para extraer información de la firma usando PHP. Por lo que debe ser capaz de ejecutar comandos de shell para usar openssl

openssl pkcs7 -in signature.pkcs7 -inform DER -print_certs > info.txt

Después de ejecutar este comando en el archivo info.txt, tendrá una cadena de certificados. El último es el que necesitas. Puede ver la estructura del archivo y analizar los datos necesarios.

Por favor refiérase también a esta pregunta , esta pregunta y este tema.

EDITAR en 2017-10-09 A sabiendas, le aconsejé que vea exactamente esta pregunta. Hay un código que puede ajustar a sus necesidades.

use ASN1/Type/Constructed/Sequence; use ASN1/Element; use X509/Certificate/Certificate; $seq = Sequence::fromDER($binaryData); $signed_data = $seq->getTagged(0)->asExplicit()->asSequence(); // ExtendedCertificatesAndCertificates: https://tools.ietf.org/html/rfc2315#section-6.6 $ecac = $signed_data->getTagged(0)->asImplicit(Element::TYPE_SET)->asSet(); // ExtendedCertificateOrCertificate: https://tools.ietf.org/html/rfc2315#section-6.5 $ecoc = $ecac->at($ecac->count() - 1); $cert = Certificate::fromASN1($ecoc->asSequence()); $commonNameValue = $cert->tbsCertificate()->subject()->toString(); echo $commonNameValue;

Lo he ajustado para ti, pero por favor haz el resto solo.

Tengo una aplicación que necesita recuperar algunos datos (nombre del firmante) de la firma digital "adjunta" en archivos PDF.

He encontrado solo ejemplos en Java y C # usando el método GetSignatureNames de la clase iText AcroFields

edit: probé pdftk con dump_data_fields y generate_fpdf y el resultado fue que (desafortunadamente):

/Fields [ << /V /dftk.com.lowagie.text.pdf.PdfDictionary@3048918 /T (Signature1) >>]

y

FieldType: Signature FieldName: Signature1 FieldFlags: 0 FieldJustification: Left

Gracias por adelantado !


He usado iText y lo encontré muy confiable, lo recomiendo altamente. Siempre puede llamar al código java como un "microservicio" desde PHP.