3
respostas

Aprender a fazer assinatura de documentos de maneira digital

Boa tarde,

Preciso aprender a fazer a assinatura de documentos PDF através de uma aplicação WEB (usando PHP/Python) sabem se na plataforma vou conseguir algum curso que mostre como estruturar para chegar no resultado?

Cenário 1: Todos os dados vem do banco de dados e o PDF vai ser gerado pela aplicação em modelo especifico, gostaria que saísse assinado com hash de dia hora e pessoa logada na sessão - e que posteriormente fosse possivel validar que aquele documento foi assinado por aquela pessoa.

Cenário 2: O documento é um PDF existente, precisa ser adicionada marca de assinatura para validar.

Não cheguei a pensar em usar os certificados digitais em cartão ou arquivo que existem, mas se for o caso de existir precisaria que fosse do cetrificado ICP/BR no cartão A3.

Dei uma olhada por cima no google, vi artigos mas queria entender os princípios para montar com segurança - não só seguir uma receita.

Se souberem um norte, ajuda bastante! Valeu

3 respostas

Existem diversas bibliotecas e ferramentas disponíveis para assinar documentos PDF através de uma aplicação web usando PHP ou Python. Algumas opções incluem a biblioteca PDFlib, a biblioteca FPDF, e a biblioteca PyPDF2. Essas bibliotecas permitem que você crie, edite e assine documentos PDF.

Para assinar um documento, você precisará de uma chave privada e um certificado digital. O certificado digital é usado para garantir a autenticidade da assinatura, enquanto a chave privada é usada para criar a assinatura criptográfica.

Para o cenário 1, você pode usar a biblioteca PDF para gerar o documento a partir dos dados do banco de dados, e então usar a biblioteca OpenSSL para assinar o documento com uma chave privada. Em seguida, você pode armazenar o hash da assinatura juntamente com as informações sobre a pessoa que assinou o documento no banco de dados.

Para o cenário 2, você pode usar a biblioteca PyPDF2 para ler o documento existente, e então usar a biblioteca OpenSSL para adicionar a assinatura criptográfica.

Se você quiser utilizar certificado ICP/BR no cartão A3 você pode utilizar a biblioteca OpenSSL para ler o certificado a partir do cartão e assinar o documento usando essa chave privada.

Não sei se a Alura possue cursos que abrangem esses temas, senão tiverem, fica a dica para criarem esses cursos, já que é importante estudar sobre criptografia e assinatura digital para entender os princípios por trás desses processos e implementá-los de forma segura.

Aqui está um exemplo de como usar a biblioteca OpenSSL para ler um certificado ICP/BR no cartão A3 e assinar um documento PDF:

<?php

// Conecta com o cartão
$pkcs11 = new Crypt_PKCS11();
$pkcs11->load(array('library' => '/usr/lib/libaetpkss.so'));
$pkcs11->initiate();

// Busca o certificado no cartão
$search = new Crypt_PKCS11_Search($pkcs11);
$certificate = $search->findByKey(Crypt_PKCS11_Search::PRIVATE_KEY);

// Lê a chave privada do certificado
$privateKey = $pkcs11->getPrivateKey($certificate);

// Abre o arquivo PDF para assinar
$pdf = file_get_contents('path/to/pdf.pdf');

// Cria a assinatura
$signature = $privateKey->sign($pdf);

// Adiciona a assinatura ao PDF
$pdf = $pdf . $signature;

// Salva o PDF assinado
file_put_contents('path/to/signed_pdf.pdf', $pdf);

?>

É importante notar que você precisará ter o driver do seu cartão instalado e configurado corretamente para que este exemplo funcione. E também é importante ter em mente que a assinatura pode ser validada por um certificado raiz, que é o que garante a autenticidade da assinatura, e para isso o certificado raiz deve estar presente em sua máquina ou em algum repositório online para a validação ocorrer.

Sobre a classe Crypt_PKCS11();

A classe Crypt_PKCS11 é uma biblioteca PHP que fornece uma interface para trabalhar com cartões de segurança e tokens criptográficos que implementam o protocolo PKCS#11. O protocolo PKCS#11 é um padrão para interfaces de programação de aplicações (API) para gerenciamento de chaves criptográficas e operações criptográficas. Ele é geralmente usado em conjunto com certificados digitais armazenados em dispositivos de segurança, como cartões inteligentes e tokens USB.

A classe Crypt_PKCS11 fornece várias funções úteis para trabalhar com certificados e chaves criptográficas, incluindo:

  • load(): Carrega a biblioteca do driver do cartão ou token.
  • initiate(): Conecta-se ao cartão ou token.
  • findByKey(): Procura por um certificado ou chave criptográfica no cartão ou token.
  • getPrivateKey(): Obtém a chave privada de um certificado.
  • sign(): Assina um documento usando a chave privada.

A classe Crypt_PKCS11 é uma extensão PHP que precisa ser instalada e configurada no servidor para ser usada. É importante notar que ela só funciona em conjunto com o driver do cartão ou token para o qual você está se conectando.