Como Assinar um PDF Digitalmente em Node.js

Aprenda como assinar digitalmente PDFs com certificado A3 usando Node.js. Solução avançada e segura para NF-e em ambientes Windows e Linux. Otimize seu servidor para assinaturas digitais.

Compartilhe:

Atualizado em: 12/12/2024.

O certificado digital A1 é amplamente utilizado em aplicações fiscais, como emissão de Notas Fiscais Eletrônicas (NF-e), por ser armazenado no formato .pfx ou .pem, facilitando sua integração com sistemas hospedados, sejam eles em Windows ou Linux. Diferente do certificado A3, o A1 não requer dispositivos físicos, o que o torna ideal para servidores.

Neste guia avançado, vamos abordar como realizar a assinatura digital de PDFs com certificado A1 usando Node.js. O foco será em implementações que funcionem tanto em servidores Windows quanto Linux.


1. Entendendo o Certificado A1

O certificado A1:

  • Armazenamento: Arquivo digital no formato .pfx ou .pem.
  • Portabilidade: Pode ser carregado diretamente em servidores.
  • Uso em NF-e: Atende às exigências da SEFAZ para emissão de documentos fiscais.

2. Ferramentas e Bibliotecas Necessárias

Bibliotecas

  1. node-signpdf: Para inserir a assinatura no PDF.
  2. node-forge: Para manipular e carregar o certificado digital.
  3. pdf-lib: Para preparar o PDF com campos de assinatura.

Instalando Dependências

npm install node-signpdf pdf-lib forge

3. Configuração do Ambiente

Certifique-se de que o certificado A1 está disponível no servidor em formato .pfx ou .pem. Além disso, mantenha a chave privada protegida.

Abre em nova aba

VAI GOSTAR:Pacotes e ferramentas Node.js que deveria conhecer

Ambientes

  • Windows:Certifique-se de que o arquivo .pfxestá acessível e que o servidor tem permissões adequadas para lê-lo.
  • Linux:Verifique as permissões de leitura no diretório onde o certificado está armazenado.

4. Preparação do PDF

Antes de assinar,é necessário adicionar um campo de assinatura ao PDF.

Código para Adicionar Campo de Assinatura

const{PDFDocument}=require('pdf-lib');const fs=require('fs');async function preparePDF(inputPath,outputPath){// Leia o PDF existente
const pdfBytes=fs.readFileSync(inputPath);// Carregue o PDF usando pdf-lib
const pdfDoc=await PDFDocument.load(pdfBytes);// Adicione uma anotação de campo para assinatura
const pages=pdfDoc.getPages();const firstPage=pages[0];firstPage.drawText('Assinado digitalmente:',{x:50,y:50,size:12,});// Salve o PDF modificado
const modifiedPdfBytes=await pdfDoc.save();fs.writeFileSync(outputPath,modifiedPdfBytes)}preparePDF('documento.pdf','documento-preparado.pdf');

5. Assinatura Digital Usando o Certificado A1

5.1. Carregando o Certificado

Utilize o node-forgepara carregar o certificado e a chave privada.

Código para Carregar o Certificado

const forge=require('node-forge');const fs=require('fs');function loadCertificate(pfxPath,passphrase){const pfxBuffer=fs.readFileSync(pfxPath);const p12Asn1=forge.asn1.fromDer(pfxBuffer.toString('binary'));const p12=forge.pkcs12.pkcs12FromAsn1(p12Asn1,false,passphrase);// Extraia a chave privada e o certificado
let privateKey,certificate;p12.safeContents.forEach((safeContent)=>{safeContent.safeBags.forEach((safeBag)=>{if (safeBag.type===forge.pki.oids.keyBag){privateKey=forge.pki.privateKeyToPem(safeBag.key)}else if (safeBag.type===forge.pki.oids.certBag){certificate=forge.pki.certificateToPem(safeBag.cert)}})});return{privateKey,certificate}}// Exemplo de uso
const{privateKey,certificate}=loadCertificate('./certificado.pfx','SENHA_DO_CERTIFICADO');console.log(privateKey,certificate);

5.2. Assinando o Hash do PDF

Código para Assinatura

const crypto=require('crypto');function signData(dataToSign,privateKey){const signer=crypto.createSign('RSA-SHA256');signer.update(dataToSign);return signer.sign(privateKey,'base64')}// Exemplo de uso
const dataToSign='Hash do PDF';// Substitua pelo hash real do PDF
const signature=signData(dataToSign,privateKey);console.log('Assinatura:',signature);

6. Inserindo a Assinatura no PDF

Após gerar a assinatura,insira-a no PDF usando o node-signpdf.

Código para Inserir Assinatura

const{plainAddPlaceholder}=require('node-signpdf/dist/helpers');const SignPdf=require('node-signpdf');const fs=require('fs');function signPDF(inputPath,outputPath,signature,certificate){const pdfBuffer=fs.readFileSync(inputPath);// Adicione um placeholder para assinatura
const pdfWithPlaceholder=plainAddPlaceholder({pdfBuffer,reason:'Assinatura Digital Certificado A1',});// Assine o PDF
const signer=new SignPdf();const signedPdf=signer.sign(pdfWithPlaceholder,{key:Buffer.from(privateKey),cert:Buffer.from(certificate),signature:Buffer.from(signature,'base64'),});fs.writeFileSync(outputPath,signedPdf)}signPDF('documento-preparado.pdf','documento-assinado.pdf',signature,certificate);

7. Configuração para Servidores Windows e Linux

Windows

  • Certifique-se de que o arquivo .pfxestá no diretório correto.
  • Use permissões adequadas para o usuário do serviço Node.js.

Linux

  • Configure as permissões do diretório para que o serviço Node.js possa acessar o arquivo.
  • Use caminhos absolutos ao carregar o certificado.

8. Validação e Testes

8.1. Validação do Certificado

Use ferramentas como o Adobe Acrobat ou validadores da SEFAZ para verificar a integridade do documento assinado.

8.2. Logs de Depuração

Adicione logs detalhados para depurar problemas:

console.log(‘Certificado carregado com sucesso.’);
console.log(‘Assinatura gerada:’,signature);
console.log(‘PDF assinado salvo em:’,outputPath);

9. Conclusão

Este guia apresenta um processo completo e avançado para assinar PDFs com o certificado digital A1 da SEFAZ em Node.js. O uso de um certificado A1 simplifica a implementação em servidores Windows e Linux,oferecendo flexibilidade e portabilidade.

Próximos Passos

  • Configure scripts para automação em um servidor Node.js.
  • Implemente autenticação para proteger o acesso ao certificado.
  • Realize testes extensivos com documentos fiscais reais.

Com estas etapas,você estará pronto para integrar assinaturas digitais com Node.js em ambientes de produção.

Como testar e validar a assinatura do PDF

1. Preparação

  1. Arquivos Necessários:
    • O PDF a ser assinado (ex.:input.pdf).
    • O certificado digital no formato .pfx(ex.:certificado.pfx) e sua senha.
  2. Dependências Instaladas:
    • Certifique-se de que o Node.js e as bibliotecas necessárias (node-signpdf) estão instalados:bashCopiar códigonpm install node-signpdf
  3. Código Configurado:
    • Verifique se o código aponta corretamente para os arquivos (input.pdf,certificado.pfx) e a senha está correta.

2. Execução

  1. Execute o código:bashCopiar códigonode seu_arquivo.js
  2. Verifique a saída:
    • O PDF assinado será salvo no diretório atual com o nome signed.pdf(ou o nome especificado no código).

3. Validação

  1. No Adobe Reader:
    • Abra o PDF assinado (signed.pdf).
    • Confira o status da assinatura:
      • Deve indicar Assinatura válida.
      • Verifique se aparece “O documento não foi alterado desde que a assinatura foi aplicada.”
  2. No Validador da ICP-Brasil:
    • Acesse o Validador da ICP-Brasil.
    • Faça o upload do PDF assinado.
    • Verifique se a assinatura está conforme as normas ICP-Brasil.
  3. Outros Validadores (Opcional):

Se o PDF não for reconhecido como válido,revise os seguintes pontos:

  • Certificado:Certifique-se de que o .pfxcontém a chave privada e a cadeia de certificação completa.
  • Carimbo de Tempo:Verifique se o PDF possui um carimbo de tempo (opcional,mas recomendado).
  • Formato de Assinatura:Confirme que segue o padrão PAdES.

VAI GOSTAR:Mundo do Web Scraping com Node.js e Puppeteer

Fontes de referências,estudos e pesquisas.

Para aprofundar seu conhecimento sobre assinatura digital de PDFs utilizando certificados digitais no Node.js,especialmente no contexto de Nota Fiscal de Serviço Eletrônica (NFSe),seguem algumas referências úteis:

Artigos e Tutoriais:

  1. Assinatura Digital via JavaScript:Este repositório no GitHub demonstra como implementar a assinatura digital de documentos utilizando JavaScript,o que pode ser adaptado para Node.js. GitHub
  2. Assine documentos com assinaturas digitais usando a API REST no Node.js:Este artigo detalha como utilizar a API REST do GroupDocs.Signature Cloud para assinar documentos PDF e DOCX em Node.js. GroupDocs Blog
  3. Como instalar um certificado SSL no Node.js:Embora focado em certificados SSL,este tutorial fornece insights sobre a configuração de certificados em ambientes Node.js,o que é relevante para o uso de certificados digitais. SSL Dragon

Bibliotecas e Repositórios no GitHub:

  1. ns-nfe-node:Biblioteca em Node.js para emissão de Nota Fiscal Eletrônica (NFe) utilizando a API da NS Tecnologia. GitHub
  2. client-nodejs:Cliente oficial da API NFe.io para Node.js,facilitando a integração com serviços de emissão de notas fiscais. GitHub
  3. NFe-NodeJS:Repositório que demonstra a emissão de Nota Fiscal Eletrônica para Node.js utilizando a REST API da WebmaniaBR®. GitHub
  4. autenticacao-ICP-Brasil:Instruções para autenticar um token/certificado A1/A3 no site,apresentando o e-CPF ou e-CNPJ,com exemplos em PHP e Node.js. GitHub

Documentação Oficial:

  • NFe.io –Documentação para Desenvolvedores:Documentação oficial da NFe.io,incluindo bibliotecas para Node.js e exemplos de uso. NFe.io
  • GroupDocs.Signature Cloud SDK para Node.js:Documentação oficial do SDK,útil para implementar assinaturas digitais em diversos formatos de documentos.

Considerações Importantes:

  • Certificado Digital A3:Este tipo de certificado requer atenção especial devido ao seu armazenamento em dispositivos físicos,como tokens USB ou smart cards. A integração com Node.js pode demandar o uso de bibliotecas específicas para comunicação com esses dispositivos,como PKCS#11.
  • Ambientes Windows e Linux:A configuração e uso de certificados digitais podem variar entre sistemas operacionais. Certifique-se de instalar os drivers e middlewares adequados fornecidos pelo fabricante do certificado para cada ambiente.

Estas referências fornecerão uma base sólida para implementar a assinatura digital de PDFs em Node.js,especialmente no contexto de NFSe,utilizando certificados digitais A3.

PODE GOSTAR:Entrevista de técnica sobre Node.js:Perguntas e respostas

LEIA TAMBÉM:Livros e cursos grátis para DevOps e DevSecOps

VAI GOSTAR

Compartilhe:

Ramos da Informática
Ramos da Informáticahttps://ramosdainformatica.com.br
Ramos da Informática é um hub de comunidade sobre linguagens de programação, banco de dados, DevOps, Internet das Coisas, tecnologia da indústria 4.0, Cyber Segurança e Startups.

RECENTES

Claude Sonnet 4.5: Mais Avançado para Programação e Automação

A Anthropic acaba de lançar o Claude Sonnet 4.5,...

AP2 do Google: Desenvolva Pagamentos para agentes de IA

O Google lançou o Agent Payments Protocol (AP2), um...

Curso gratuito de GitHub Copilot para devs e estudantes

A Microsoft abriu as inscrições para o primeiro Bootcamp...

Santander e a Alura oferecem 60.000 bolsas em carreira de tecnologia

Quer dar um salto na sua carreira? O Santander Imersão Digital está...

Google Tradutor desafia o Duolingo com novas ferramentas de aprendizagem de idiomas

O Google está lançando um novo recurso experimental com...

A peça que faltava para agentes de IA autônomos.

Este artigo foi originalmente publicado em: https://www.linkedin.com/newsletters/ezine-dev-ramos-da-inform%25C3%25A1tica-6947960536550526976/ A inteligência...
Newsletter semanal no LinkedIn
EZine Dev Ramos da Informática
Grandes dicas em JavaScript, Node, React, Next, Banco de Dados & IA.
Assinar grátis
Abre em nova aba
spot_img