terça-feira, janeiro 21, 2025
spot_img

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.

💡 Anuncie no Ramos da Informática!

Aproveite 15% de desconto no pacote trimestral ou ganhe 3 meses extras no contrato anual.

🚀 Aprimore suas Habilidades DevOps!

Descubra como otimizar fluxos de trabalho, melhorar a integração contínua e revolucionar o gerenciamento de projetos no mundo DevOps. Acesse agora!

Saiba Mais

💻 Torne-se um Desenvolvedor Fullstack!

Domine as tecnologias mais requisitadas do mercado e conquiste sua carreira dos sonhos como Desenvolvedor Fullstack. Inscreva-se hoje!

Inscreva-se

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

Ambientes

  • Windows: Certifique-se de que o arquivo .pfx está 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-forge para 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 .pfx está 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 .pfx conté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

Gostou deste conteúdo?

Assine o E-Zine Ramos da Informática e receba semanalmente conteúdos exclusivos focados em desenvolvimento frontend, backend e banco de dados para transformar sua carreira tech.

📘 Conteúdo exclusivo

Dicas, insights e guias práticos sobre desenvolvimento e bancos de dados.

🚀 Hacks de carreira

Ferramentas e estratégias para se destacar no mercado tech.

🌟 Tendências tech

As novidades mais relevantes em desenvolvimento web e mobile e bancos de dados.

Já somos mais de 5.000 assinantes! Junte-se à nossa comunidade de profissionais que compartilham conhecimento e crescem juntos no universo tech.

Quero Assinar Agora

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.
spot_img

Relacionados

RECENTES

Transforme sua carreira e conquiste sua primeira vaga de desenvolvedor em 2025!

O mercado de tecnologia nunca esteve tão aquecido, mas...

Ferramentas Essenciais para o Desenvolvedor Web Moderno – I

Mensalmente, vamos apresentar aos leitores da Ramos da Informática...

WordPress em Crise: Desafios Atuais e o Futuro da Plataforma

No dia 11 de janeiro de 2025, Gavin Anderegg...

node-web-audio-api: Processamento de Áudio Avançado no Node.js

O node-web-audio-api é uma implementação da Web Audio API...

Express.js em 2025: um Olhar para o Futuro

Em 9 de janeiro de 2025, o Comitê Técnico...

Diferenças Entre Funções e Procedures em Node.js

Com a popularidade crescente de Node.js e TypeORM, a...

🚀 Aprimore suas Habilidades DevOps!

Descubra como otimizar fluxos de trabalho, melhorar a integração contínua e revolucionar o gerenciamento de projetos no mundo DevOps. Acesse agora!

Saiba Mais

💻 Torne-se um Desenvolvedor Fullstack!

Domine as tecnologias mais requisitadas do mercado e conquiste sua carreira dos sonhos como Desenvolvedor Fullstack. Inscreva-se hoje!

Inscreva-se