Referencia · Firma digital
Firma XAdES-EPES y certificado .p12 para Hacienda
.p12 y su PIN), los algoritmos exactos y dónde suele fallar la implementación — para que decidas si lo hacés vos o dejás que Plaxp lo firme por vos.¿Qué firma exige Hacienda?
Una firma XAdES incrustada en el propio XML (enveloped), con una política de firma declarada según la resolución de la versión 4.4. Al llevar esa política, la firma es técnicamente XAdES-EPES (XAdES-BES + policy). No es una firma genérica: Hacienda valida la estructura, los algoritmos y que el certificado corresponda al emisor.
¿Qué necesito? El certificado .p12 y su PIN
Para firmar hacen falta dos cosas, ambas emitidas por Hacienda para tu cédula:
- El certificado
.p12— formato PKCS#12, contiene el certificado X509 público y la llave privada. - El PIN — desbloquea la llave privada dentro del
.p12.
En Plaxp el .p12 se asocia al emisor y el PIN se guarda cifrado con AES-256. Cada emisión carga el certificado, extrae la llave y firma — sin que el PIN viaje ni quede en claro.
El .p12 es tu identidad fiscal
.p12 y tu PIN puede firmar a tu nombre. Tratalos como un secreto de producción: nunca en el repositorio, nunca en el frontend, nunca en logs.¿Qué algoritmos usa la firma?
Los que exige Hacienda v4.4. Si estás implementando la firma por tu cuenta, estos son los exactos:
Firma RSA-SHA256 (rsa-sha256)
Digest SHA-256 (xmlenc#sha256)
Canonicalización Exclusive C14N (xml-exc-c14n#)
Política SignaturePolicyIdentifier (resolución v4.4)
Estructura 3 Reference: documento (enveloped)
+ SignedProperties (XAdES) + KeyInfo
Propiedades SigningTime (hora CR, UTC-6),
SigningCertificate (CertDigest SHA-256 + IssuerSerial)¿Dónde suele fallar la implementación propia?
Firmar el XML "a mano" es donde más gente se traba. Los tropiezos típicos:
- Canonicalización equivocada — usar C14N normal en vez de Exclusive C14N cambia el digest y Hacienda rechaza la firma.
- Orden y transforms de las Reference — la del documento necesita el transform
enveloped-signature; un orden o transform distinto invalida la firma. - Olvidar la política de firma — sin
SignaturePolicyIdentifierla firma queda como BES y no cumple la 4.4. - Fecha en otra zona horaria — el
SigningTimedebe ir en hora de Costa Rica (UTC-6); usar UTC "adelanta" el sello. - Leer mal el
.p12— la llave puede venir cifrada (pkcs8ShroudedKeyBag) o no; manejar solo un caso rompe con ciertos certificados.
¿Cómo lo hace Plaxp por vos?
No tenés que implementar nada de lo anterior. Le pasás los datos de la venta a la y Plaxp genera el XML v4.4, lo firma con XAdES-EPES usando tu .p12 (con los algoritmos de arriba) y lo envía a Hacienda. La firma es una reimplementación fiel del firmador oficial, verificada contra comprobantes aceptados en producción.
POST único que hace todo es suficiente.¿Querés que firmemos por vos?
Te damos credenciales de sandbox y te acompañamos en la integración. Escribinos y arrancamos hoy.
Solicitar acceso a la APITe acompañamos en la puesta en marcha · soporte rápido de gente real · fácil de usar para todo tu equipo. Somos gente ayudando gente.
