Firma Digital
¿Qué es la firma digital en CFE?
Section titled “¿Qué es la firma digital en CFE?”DGI exige que cada comprobante fiscal electrónico esté firmado digitalmente usando el estándar XAdES-BES (XML Advanced Electronic Signatures - Basic Electronic Signature). Esta firma garantiza la autenticidad e integridad del documento XML.
El SDK maneja toda la complejidad de la firma de forma automática. Solo necesitás configurar la ruta y contraseña del certificado.
Certificados soportados
Section titled “Certificados soportados”El SDK acepta certificados digitales en formato:
.p12(PKCS#12).pfx(Personal Information Exchange — equivalente a.p12en Windows)
El certificado debe estar emitido por una Autoridad Certificante reconocida por AGESIC y vinculado al RUT del emisor.
Proveedores de certificados en Uruguay
Section titled “Proveedores de certificados en Uruguay”| Proveedor | Sitio |
|---|---|
| ABITAB | abitab.com.uy |
| Correo Uruguayo | correo.com.uy |
| CertiSur | certisur.com |
Firma automática al enviar
Section titled “Firma automática al enviar”Cuando llamás a EnviarCfeAsync, el SDK:
- Genera el XML del CFE
- Firma el XML con XAdES-BES usando el certificado configurado
- Envuelve el XML firmado en el sobre SOAP
- Envía la solicitud al endpoint DGI
// La firma ocurre automáticamente aquívar respuesta = await client.EnviarCfeAsync(eticket);Firmar sin enviar
Section titled “Firmar sin enviar”Si necesitás el XML firmado para archivarlo o enviarlo por otro canal:
string xmlFirmado = client.GenerarYFirmar(eticket);
// Guardar para archivo obligatorioawait File.WriteAllTextAsync( $"xml/eticket_{eticket.Numero:D8}.xml", xmlFirmado, System.Text.Encoding.UTF8);Validar el certificado antes de operar
Section titled “Validar el certificado antes de operar”Antes de emitir comprobantes en producción, verificá que el certificado es válido:
try{ using var client = new UruFacturaClient(config); // Si el certificado es inválido, el constructor lanzará una excepción Console.WriteLine("✅ Certificado cargado correctamente");}catch (UruFacturaException ex) when (ex.Message.Contains("certificado")){ Console.Error.WriteLine($"❌ Error con el certificado: {ex.Message}");}Gestión segura del certificado
Section titled “Gestión segura del certificado”Recomendaciones de seguridad
Section titled “Recomendaciones de seguridad”-
No subas el archivo
.p12al repositorio. Agregalo a.gitignore:*.p12*.pfx -
Usá variables de entorno para la contraseña:
PasswordCertificado = Environment.GetEnvironmentVariable("CERT_PASSWORD")! -
En producción, almacená el certificado en un gestor de secretos:
- Azure Key Vault (certificados)
- AWS Secrets Manager
- HashiCorp Vault
-
Rotá el certificado antes de su vencimiento. Los certificados generalmente vencen cada 1 a 3 años.
-
Usá permisos restrictivos en el archivo del certificado:
Terminal window chmod 600 /ruta/certificado.p12chown app:app /ruta/certificado.p12