Ir al contenido

Certificado .p12

Para firmar comprobantes necesitas un certificado de firma electrónica en formato .p12 (PKCS#12), emitido por una entidad de certificación acreditada en Ecuador.

Cada entidad empaqueta el certificado de forma ligeramente distinta, así que la librería tiene una estrategia de lectura por cada una. Hoy están soportadas:

Si tu certificado es de otra entidad, al firmar obtendrás el error UNKNOWN_SIGN_STRATEGY“No existe estrategia para el certificado: …”. En ese caso escribe a osodreamer2023@gmail.com con el nombre de la entidad para evaluar su integración.

signXml espera el contenido binario del archivo, no una ruta:

firmar.ts
import { signXml } from "osodreamer-sri-xml-signer";
import * as fs from "fs";
const p12Buffer = fs.readFileSync("./certificado.p12");
const xmlBuffer = fs.readFileSync("./comprobante.xml");
const firmado = await signXml({
p12Buffer,
password: process.env.CERT_PASSWORD!,
xmlBuffer,
});

Si el certificado llega desde una subida web, pásale directamente el buffer del archivo; no hace falta escribirlo en disco.

Son los dos fallos más frecuentes al empezar:

Error Qué pasó
P12_STRUCTURE_ERROR El archivo no es un PKCS#12 válido. Suele ser que se subió el archivo equivocado, o que se corrompió al transferirlo
P12_PASSWORD_ERROR El archivo sí es válido, pero la contraseña no coincide

Que estén separados es útil: si obtienes P12_PASSWORD_ERROR, el archivo está bien y solo falla la clave — no hace falta que el usuario vuelva a subirlo.

Ver Errores de la librería para capturarlos.

Un certificado vencido o revocado no lo detecta la librería: lo detecta el SRI al validar, y responde con el error 39 – Firma inválida o 42 – Certificado revocado. Si tus comprobantes empiezan a fallar de golpe sin haber tocado el código, revisa primero la fecha de caducidad del certificado.