Referencia · Firma digital

Firma XAdES-EPES y certificado .p12 para Hacienda

Todo comprobante electrónico va firmado digitalmente antes de llegar a Hacienda. Acá explicamos qué firma exige la versión 4.4, qué necesitás (el certificado .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

Quien tiene tu .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:

algoritmos-xades
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 SignaturePolicyIdentifier la firma queda como BES y no cumple la 4.4.
  • Fecha en otra zona horaria — el SigningTime debe 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.

Si querés control fino, la API también expone pasos sueltos: solo generar el XML, solo firmar un XML que ya tenés, o solo enviar uno firmado. Pero para la mayoría, el 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 API

Te 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.