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.
🚀 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-seVAI 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 Verificador para 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
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.