Certificado A1 e assinatura
O certificado A1 permite assinar XML e autenticar operações fiscais. A versão inicial aceita PFX/P12 com senha; certificado A3 não faz parte do escopo.
gerarXml e validar podem ser chamados sem A1. assinar, transmitir, consultar, cancelar, cartaCorrecao e inutilizar exigem certificado.
Como informar o A1
Você pode carregar o arquivo em memória:
import { readFile } from 'node:fs/promises';
import { criarEmissor } from 'cosmemilton-acbr-node';
const senha = process.env.NFE_A1_SENHA;
if (senha === undefined) throw new Error('Configure NFE_A1_SENHA');
const emissor = criarEmissor({
cnpj: 'CNPJ_DO_EMITENTE', // substitua por 14 dígitos
uf: 'CE',
modelo: 55,
ambiente: 2,
certificado: { pfx: await readFile('./certificado.pfx'), senha }
});Ou informar o caminho do arquivo:
certificado: { arquivo: './certificado.pfx', senha }Escolha pfx ou arquivo. O campo arquivo é lido pela API quando a operação é preparada; use um caminho absoluto quando o diretório de execução puder variar. O limite do PFX é 2 MiB. CNPJ do emitente e identidade fiscal do documento precisam corresponder ao certificado utilizado.
O fragmento acima mostra a configuração para sua integração e precisa de dados próprios. Ele não deve ser aplicado ao CNPJ sintético do primeiro guia com um certificado real.
Assinar, conferir e salvar
A sequência abaixo parte de uma instância emissor configurada e de xml com os dados completos de sua integração. Ela assina e valida localmente, sem chamar transmissão:
import { writeFile } from 'node:fs/promises';
try {
const assinado = await emissor.assinar(xml);
if (!assinado.sucesso || !assinado.xmlBase64) {
throw new Error(assinado.codigo ?? assinado.xMotivo ?? assinado.estado);
}
const xmlAssinado = Buffer.from(assinado.xmlBase64, 'base64').toString('utf8');
const validado = await emissor.validar(xmlAssinado);
if (!validado.sucesso) {
throw new Error(validado.codigo ?? validado.xMotivo ?? validado.estado);
}
await writeFile('./nota-assinada.xml', Buffer.from(assinado.xmlBase64, 'base64'));
} finally {
await emissor.fechar();
}Validar o schema confere a estrutura; não comprova que os impostos estão corretos nem que a SEFAZ autorizou a nota. Não altere os bytes do XML depois da assinatura.
Onde guardar senha e certificado
Use o mecanismo de segredos do seu servidor. A variável NFE_A1_SENHA é lida pela sua aplicação; não é uma configuração automática da biblioteca. Evite armazenar PFX e senha em código, repositório ou logs.
A API envia o certificado e a senha ao processo fiscal pelas pipes, sem colocá-los nos argumentos. Isso não elimina a responsabilidade da aplicação por proteger as credenciais em seu ambiente.
Continue em NF-e e NFC-e ou consulte a configuração.