Siguiendo las instrucciones proporcionadas por la Dirección General de Impuestos Internos (DGII) en su documento "Firmado de e-CF", es posible realizar la firma digital de los e-CF utilizando diversos lenguajes de programación. En el caso de PHP, la DGII recomienda emplear la biblioteca xmldsig.
Aunque la documentación oficial es adecuada y cumple con los requisitos establecidos, es necesario destacar lo siguiente:
En la clase XmlSigner
, específicamente en la línea 179, se debe ajustar el método de canonicalización.
El código original:
$c14nSignedInfo = $signedInfoElement->C14N(false, false);
// o simplemente
$c14nSignedInfo = $signedInfoElement->C14N();
Para mantener la integridad de la biblioteca original y seguir las recomendaciones sin realizar cambios drásticos:
- Copiar la clase completa
XmlSigner
y crear una nueva clase en otra ubicación dentro de tu proyecto con las modificaciones necesarias. - Referenciar esta nueva clase en la segunda clase recomendada por la documentación.
-
El problema ocurre porque OpenSSL 3.0 (utilizado en versiones recientes de PHP) clasifica algunos algoritmos como "legacy" y no los habilita por defecto, lo que impide trabajar con archivos
.p12
que usan esos algoritmos. -
Solución 1: Usa PHP 8.2, que incluye OpenSSL 1.1.1p, donde los algoritmos necesarios están habilitados por defecto.
-
Solución 2: Si usas OpenSSL 3.0 o superior:
- Modifica el archivo
openssl.cnf
para activar el soporte "legacy".- En la sección
[provider_sect]
, agrega:legacy = legacy_sect
- En
[legacy_sect]
, asegura que esté:activate = 1
- En la sección
- Usa el argumento
-legacy
en comandos de OpenSSL:openssl pkcs12 -in archivo.p12 -legacy -nodes
- Modifica el archivo
Esto habilita los algoritmos necesarios y soluciona el problema.