Firma digital CAdES vs XAdES en Java: las diferencias que importan cuando tu CA te pide una y vos tenés la otra

Una firma digital es básicamente como un sello de lacre con ADN: no importa si el sobre viaja en tren, avión o en la mochila de alguien — si el destinatario rompe el lacre o cambia el contenido, se nota. El problema es que hay dos tipos de lacre en el mundo CMS/XML, se llaman igual en los folletos ("firma avanzada ETSI"), pero no los podés mezclar. Y cuando la Autoridad de Certificación te devuelve un error de validación, la respuesta no está en el mensaje de error — está en haber elegido el formato equivocado desde el principio.

Ya me pasó: mandé un .p7s detached a un sistema que esperaba un nodo <ds:Signature> embebido en el XML. La firma era criptográficamente perfecta. El receptor la rechazó igual, porque no la sabía leer. Ahí entendí que el problema nunca es la criptografía — es el contrato de formato.

Mi tesis es concreta: CAdES y XAdES no son variantes del mismo estándar, son formatos para dominios distintos con estructuras y perfiles de confianza distintos. Elegir mal no es un detalle técnico: es un documento que no pasa validación del otro lado, aunque la firma sea impecable. Y esa decisión se toma antes de escribir código, no debugueando después.