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
node-signpdf
: Para inserir a assinatura no PDF.node-forge
: Para manipular e carregar o certificado digital.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.
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
- Arquivos Necessários:
- O PDF a ser assinado (ex.:
input.pdf
). - O certificado digital no formato
.pfx
(ex.:certificado.pfx
) e sua senha.
- O PDF a ser assinado (ex.:
- 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
- Certifique-se de que o Node.js e as bibliotecas necessárias (
- Código Configurado:
- Verifique se o código aponta corretamente para os arquivos (
input.pdf
,certificado.pfx
) e a senha está correta.
- Verifique se o código aponta corretamente para os arquivos (
2. Execução
- Execute o código:bashCopiar código
node seu_arquivo.js
- 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).
- O PDF assinado será salvo no diretório atual com o nome
3. Validação
- 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.”
- Abra o PDF assinado (
- 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.
- Outros Validadores (Opcional):
- Utilize o Certisign Verificadorpara testar compatibilidade.
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:
- 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
- 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
- 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:
- ns-nfe-node:Biblioteca em Node.js para emissão de Nota Fiscal Eletrônica (NFe) utilizando a API da NS Tecnologia. GitHub
- 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
- NFe-NodeJS:Repositório que demonstra a emissão de Nota Fiscal Eletrônica para Node.js utilizando a REST API da WebmaniaBR®. GitHub
- 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
- GitHub Copilot:Claude 3.5,Gemini 1.5 e OpenAI o1-preview
- Domine a IA do Chrome DevTools – para Desenvolvedores
- Os Melhores Cursos Grátis de Inteligência Artificial com Certificação
- Audible:Aumente Seus Conhecimentos e Produtividade com Audiolivros
- A Melhor Estação de Trabalho para Desenvolvedores em 2025
- Robótica e Programação para Crianças e Adolescentes
- Como Assinar um PDF Digitalmente em Node.js
- GitHub Copilot – Hacks,Tutoriais e Novidades
- Meu dinheiro
- Vida Financeira Saudável:Dicas Práticas e Hacks para Economizar Dinheiro