1-intro firel
La Firma Electrónica FIREL de la Suprema Corte de Justicia de México es un sistema que permite la autenticación y la firma digital de documentos electrónicos. A continuación, responderé a tus preguntas específicas sobre su funcionamiento, formatos de archivo y cómo trabajar con estos certificados en PHP.
Funcionamiento del Certificado Digital de Firma Electrónica FIREL
Formato de archivo que entrega: La FIREL, al igual que la FIEL del SAT, generalmente se compone de tres archivos:
- Certificado (.cer): Contiene la clave pública.
- Clave privada (.key): Protegida por una contraseña, se utiliza para firmar los documentos.
- Archivo de la solicitud (.req): Este archivo no es necesario para la firma de documentos, solo para la solicitud inicial.
Formato estándar: Los certificados suelen estar en formato X.509, que es un estándar para la infraestructura de clave pública (PKI).
Diferencia con la FIEL del SAT: Ambos son similares en cuanto a la tecnología subyacente y los estándares que siguen (PKI, X.509). La diferencia principal radica en el propósito y el ámbito de uso. La FIEL del SAT se utiliza para transacciones fiscales y administrativas con el SAT, mientras que la FIREL está destinada a trámites judiciales y administrativos en el ámbito de la Suprema Corte de Justicia.
Archivos PEM y KEY:
- PEM (Privacy Enhanced Mail): Es un formato base64 para archivos que pueden contener certificados y claves privadas. Los archivos PEM pueden tener varias extensiones como .pem, .crt, .cer, etc.
- KEYPEM: Es una combinación del archivo .key en formato PEM.
Conversión de archivos: En algunos casos, es necesario convertir los archivos .cer y .key a otros formatos como PEM o PFX. Esto puede ser útil dependiendo del software o librerías que estés utilizando.
Implementación en PHP
Para firmar documentos y verificar firmas digitales en PHP, puedes utilizar librerías como OpenSSL. Aquí te dejo un ejemplo básico para firmar y verificar un documento.
Firmar un Documento:
<?php
// Ruta a los archivos
$certificado = "path/to/certificado.cer";
$llavePrivada = "path/to/llave.key";
$passphrase = "tu-contraseña";
// Leer el contenido del certificado y la clave privada
$certContent = file_get_contents($certificado);
$keyContent = file_get_contents($llavePrivada);
// Cargar la clave privada
$privateKey = openssl_pkey_get_private($keyContent, $passphrase);
// Documento a firmar
$data = "Este es el contenido del documento que quiero firmar";
// Firmar el documento
openssl_sign($data, $firma, $privateKey, OPENSSL_ALGO_SHA256);
// Guardar la firma en un archivo
file_put_contents('firma.txt', $firma);
// Liberar la clave privada
openssl_free_key($privateKey);
echo "Documento firmado exitosamente.";
?>
Conversión de formatos
Puedes utilizar OpenSSL para convertir entre formatos:
Convertir .cer a .pem:
Firmar un Documento en Node.js
Para firmar un documento en Node.js, puedes utilizar la librería node-forge que es compatible con los navegadores. Primero, instala la librería:
npm install node-forge
Luego, puedes usar el siguiente código para firmar un documento:
const forge = require('node-forge');
const fs = require('fs');
// Leer la clave privada y el certificado
const privateKeyPem = fs.readFileSync('path/to/private-key.pem', 'utf8');
const certificatePem = fs.readFileSync('path/to/certificate.pem', 'utf8');
// Cargar la clave privada
const privateKey = forge.pki.privateKeyFromPem(privateKeyPem);
// Documento a firmar
const document = 'Este es el contenido del documento que quiero firmar';
// Crear un hash del documento
const md = forge.md.sha256.create();
md.update(document, 'utf8');
// Firmar el hash
const signature = privateKey.sign(md);
// Guardar la firma en un archivo
fs.writeFileSync('signature.bin', signature);
console.log('Documento firmado exitosamente.');
Ejecución en el Cliente (Browser)
Para hacerlo en el navegador, puedes utilizar una versión adaptada del mismo código con node-forge. Aquí te dejo un ejemplo que puedes incluir en un archivo HTML:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Firma Digital</title>
<script src="https://cdn.jsdelivr.net/npm/node-forge/dist/forge.min.js"></script>
</head>
<body>
<h1>Firma Digital</h1>
<input type="file" id="privateKeyFile" accept=".pem">
<input type="file" id="certificateFile" accept=".pem">
<button id="signButton">Firmar Documento</button>
<p id="result"></p>
<script>
document.getElementById('signButton').addEventListener('click', async () => {
const privateKeyFile = document.getElementById('privateKeyFile').files[0];
const certificateFile = document.getElementById('certificateFile').files[0];
if (!privateKeyFile || !certificateFile) {
alert('Por favor, selecciona los archivos de clave privada y certificado.');
return;
}
const privateKeyPem = await privateKeyFile.text();
const certificatePem = await certificateFile.text();
const privateKey = forge.pki.privateKeyFromPem(privateKeyPem);
const document = 'Este es el contenido del documento que quiero firmar';
const md = forge.md.sha256.create();
md.update(document, 'utf8');
const signature = privateKey.sign(md);
document.getElementById('result').textContent = 'Documento firmado exitosamente.';
console.log('Firma:', forge.util.encode64(signature));
});
</script>
</body>
</html>
Recomendaciones de Seguridad
- Clave Privada en el Cliente: Mantener la clave privada en el lado del cliente es más seguro desde el punto de vista de la responsabilidad del usuario. Asegúrate de que los usuarios sean conscientes de la importancia de proteger su clave privada.
- Transmisión Segura: Utiliza HTTPS para transmitir datos de manera segura entre el cliente y el servidor.
- Almacenamiento Seguro: Si es necesario almacenar claves privadas en el cliente, utiliza el almacenamiento seguro del navegador, como
localStoragecon cifrado adicional.
Con estos pasos y recomendaciones, puedes implementar un sistema de firma digital en Node.js y JavaScript que mantenga la clave privada en el control del usuario. Si tienes más preguntas o necesitas más detalles, no dudes en preguntar.
Comentarios
Publicar un comentario