¿Qué es XAdES-BES y por qué es obligatorio?

XAdES-BES (XML Advanced Electronic Signatures — Basic Electronic Signature) es el estándar europeo de firma digital para documentos XML definido por ETSI en la norma EN 319 132. Para las facturas electrónicas españolas, es el formato de firma exigido por el Real Decreto 1619/2012 y por FACe para garantizar la autenticidad e integridad de los ficheros Facturae.

A diferencia de una firma PDF o una firma XMLDSig básica, XAdES-BES añade propiedades cualificadas al bloque de firma: el certificado del firmante, la política de firma, el momento de la firma y los roles del firmante. Sin estos elementos, FACe rechaza el fichero aunque el XML esté perfectamente formado.

Nivel BES vs niveles superiores: FACe exige el nivel BES (Basic), que es el mínimo. Existen niveles superiores (T, C, X, XL) que añaden sellado de tiempo y validación de la cadena de certificación, pero no son requeridos para el envío estándar a FACe.

Los 8 errores más frecuentes en la firma XAdES-BES

1
Certificado expirado o revocado
El certificado FNMT tiene una validez de 2 años (persona jurídica) o 4 años (persona física). Si ha expirado o ha sido revocado por la FNMT, la firma es inválida aunque el XML sea correcto. FACe verifica el estado del certificado en tiempo real contra el OCSP de la FNMT.
Renueva el certificado en sede.fnmt.gob.es antes de que expire — puedes renovarlo con 2 meses de antelación sin perder el número de serie. Si ya expiró, solicita uno nuevo presencialmente o con DNIe. Tras renovar, vuelve a firmar el XML.
2
NIF del certificado no coincide con el NIF del emisor en el XML
FACe comprueba que el NIF/CIF del titular del certificado con el que se firmó coincida con el TaxIdentificationNumber del emisor en el XML. Si firmas con el certificado personal de un trabajador en lugar del certificado de la empresa, o si el CIF tiene un formato diferente, FACe rechaza la firma.
Firma siempre con el certificado de persona jurídica de la empresa emisora. El NIF en el certificado debe ser exactamente igual al del XML: mismo formato, sin guiones adicionales ni diferencias de mayúsculas.
3
Firma XMLDSig en lugar de XAdES-BES
XMLDSig y XAdES-BES son formatos distintos. Muchas herramientas generan una firma XMLDSig básica (<ds:Signature>) sin el bloque <xades:QualifyingProperties> que define XAdES. El resultado es un XML firmado pero en un formato que FACe no acepta.
Verifica que el XML firmado contenga el namespace xmlns:xades="http://uri.etsi.org/01903/v1.3.2#" y el bloque <xades:QualifyingProperties>. Si usas AutoFirma, selecciona explícitamente el formato XAdES en las opciones avanzadas.
4
El XML fue modificado después de firmar
La firma XAdES-BES calcula un hash del contenido del XML en el momento de firmar. Si cualquier carácter del XML es modificado después — incluso un espacio o un salto de línea — el hash no coincide y la firma queda inválida. Esto ocurre al abrir el fichero con un editor de texto que cambia el encoding o los saltos de línea.
Nunca abras ni edites el fichero .xsig tras firmar. Si necesitas corregir algo en el XML, edita el fichero original sin firmar, vuelve a validarlo y vuelve a firmar. Trata el fichero firmado como un documento sellado.
5
Algoritmo de firma obsoleto (SHA-1)
Algunas herramientas antiguas usan SHA-1 como algoritmo de hash en la firma. Desde 2023, FACe y los sistemas de validación del Ministerio rechazan firmas basadas en SHA-1 por considerarlo inseguro. El algoritmo correcto es SHA-256 (o superior).
Actualiza tu herramienta de firma o configúrala para usar SHA-256. En AutoFirma, ve a Preferencias → Algoritmo de firma → SHA256withRSA. Si usas una librería como lxml o xmlsec, especifica explícitamente http://www.w3.org/2001/04/xmldsig-more#rsa-sha256.
6
Cadena de certificación incompleta
XAdES-BES requiere incluir el certificado completo del firmante en el bloque <xades:SigningCertificate>. Si solo se incluye el thumbprint o una referencia, y no el certificado X.509 completo en Base64, los validadores no pueden verificar la cadena de confianza.
Verifica que el bloque <ds:X509Certificate> dentro de <ds:KeyInfo> contenga el certificado completo en Base64. Al exportar el certificado del almacén de Windows, selecciona "Incluir todos los certificados en la cadena de certificación".
7
Referencia a un nodo incorrecto en el XML
La firma XAdES-BES debe firmar el elemento raíz del XML Facturae (<fe:Facturae>) usando una referencia con URI="" o URI="#id-del-nodo". Si la implementación firma un nodo incorrecto o usa una referencia rota, la validación falla aunque el certificado sea válido.
Comprueba que el elemento <ds:Reference> dentro de la firma apunte al nodo correcto. En Facturae, la práctica estándar es usar URI="" para firmar todo el documento con una transformación enveloped-signature.
8
Problema con el encoding del fichero
Si el fichero XML tiene caracteres especiales (ñ, tildes, ü) codificados de forma incorrecta — por ejemplo, Latin-1 en lugar de UTF-8 — el hash de la firma no coincidirá con el contenido real del fichero. Este error es especialmente frecuente al generar XMLs en Windows con herramientas antiguas.
Asegúrate de que el XML declara <?xml version="1.0" encoding="UTF-8"?> al inicio y que el fichero está guardado realmente en UTF-8 sin BOM. Verifica con un editor hexadecimal que no haya BOM (bytes EF BB BF al inicio).

Cómo verificar tu firma antes de enviar a FACe

Antes de subir a FACe, puedes comprobar que la firma XAdES-BES está presente y tiene la estructura correcta con estas herramientas:

  • Validador Facturae de FacturaXfacturax.app/herramientas/validador-facturae — detecta si el fichero contiene firma XAdES-BES y muestra su fecha. Gratis, sin registro, sin enviar datos a ningún servidor.
  • VALIDe del Ministeriovalide.redsara.es — validación criptográfica completa del certificado y la cadena de confianza. Requiere Java o AutoFirma.
  • AutoFirma — la herramienta oficial del Ministerio para firmar y verificar documentos con certificado FNMT. Descargable en autofirma.minisap.es.
Checklist antes de subir a FACe:
  • El certificado FNMT está vigente (comprueba la fecha de expiración en el almacén de certificados)
  • El NIF del certificado coincide exactamente con el TaxIdentificationNumber del emisor en el XML
  • El fichero firmado tiene extensión .xsig y no ha sido modificado tras la firma
  • El XML contiene el namespace xmlns:xades y el bloque QualifyingProperties
  • El algoritmo de firma es SHA-256, no SHA-1
  • El fichero está en UTF-8 sin BOM
  • Has validado el XML con el validador de FacturaX sin errores críticos

Estructura técnica de XAdES-BES en Facturae

Para referencia técnica, este es el esqueleto de un bloque XAdES-BES válido en un fichero Facturae:

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
              Id="Signature">
  <ds:SignedInfo>
    <ds:CanonicalizationMethod
      Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
    <ds:SignatureMethod
      Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
    <ds:Reference URI="">
      <ds:Transforms>
        <ds:Transform
          Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
      </ds:Transforms>
      <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
      <ds:DigestValue>...</ds:DigestValue>
    </ds:Reference>
  </ds:SignedInfo>
  <ds:SignatureValue>...</ds:SignatureValue>
  <ds:KeyInfo>
    <ds:X509Data>
      <ds:X509Certificate>MIIFxDCCA...</ds:X509Certificate>
    </ds:X509Data>
  </ds:KeyInfo>
  <ds:Object>
    <xades:QualifyingProperties
      xmlns:xades="http://uri.etsi.org/01903/v1.3.2#"
      Target="#Signature">
      <xades:SignedProperties Id="SignedProperties">
        <xades:SignedSignatureProperties>
          <xades:SigningTime>2026-05-05T10:00:00+02:00</xades:SigningTime>
          <xades:SigningCertificate>
            <xades:Cert>
              <xades:CertDigest>...</xades:CertDigest>
              <xades:IssuerSerial>...</xades:IssuerSerial>
            </xades:Cert>
          </xades:SigningCertificate>
        </xades:SignedSignatureProperties>
      </xades:SignedProperties>
    </xades:QualifyingProperties>
  </ds:Object>
</ds:Signature>
¿Prefieres que la firma la haga FacturaX automáticamente?

Sube el PDF, FacturaX extrae los datos y firma el Facturae 3.2.2 con tu certificado FNMT. Sin errores, sin configuración.

Firmar gratis →

Preguntas frecuentes sobre XAdES-BES

¿Qué es XAdES-BES?

XAdES-BES (XML Advanced Electronic Signatures — Basic Electronic Signature) es el formato de firma digital requerido por FACe para garantizar la autenticidad e integridad de las facturas electrónicas Facturae. Sin esta firma, FACe rechaza el fichero independientemente de que el XML sea correcto.

¿Por qué FACe dice que mi firma no es válida si el certificado está vigente?

El error más frecuente es que el NIF del titular del certificado no coincida con el NIF del emisor en el XML. Otro motivo habitual es que la firma sea XMLDSig básica en lugar de XAdES-BES — son formatos distintos aunque visualmente similares.

¿Cuánto tiempo tarda en expirar un certificado FNMT?

Los certificados de persona jurídica de la FNMT tienen una validez de 2 años. Los de persona física, 4 años. Puedes renovarlos con hasta 2 meses de antelación desde sede.fnmt.gob.es sin perder el número de serie.

¿Puedo verificar mi firma XAdES-BES antes de subir a FACe?

Sí. El validador gratuito de FacturaX detecta si el fichero contiene firma XAdES-BES y su fecha de firma, todo en tu navegador sin enviar datos. Para verificación criptográfica completa, usa VALIDe del Ministerio en valide.redsara.es.