O bajarlo a arquitectura técnica con tablas y endpoints (como tu sistema PHP)
Perfecto 👌 ahora lo bajamos a arquitectura técnica real en PHP + MySQL, alineado con lo que ya manejas (MVC, POST, tablas, evidencias, etc.) y con el blindaje procesal que necesitas.
🏗 1️⃣ Arquitectura general del módulo
📦 Módulo: firma_electronica
/modulos/firma/
├── controllers/
│ └── FirmaController.php
├── models/
│ └── FirmaModel.php
├── services/
│ ├── ValidadorFirma.php
│ ├── OcspService.php
│ ├── HashService.php
│ └── Nom151Service.php
├── storage/
│ ├── documentos/
│ ├── evidencias/
│ └── constancias/
🧾 2️⃣ Diseño de base de datos
📌 Tabla principal: documentos_firmados
CREATE TABLE documentos_firmados (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre_archivo VARCHAR(255),
ruta VARCHAR(500),
hash_sha256 VARCHAR(64),
fecha_recepcion DATETIME,
estado_validacion ENUM('pendiente','valido','invalido'),
creado_en TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
📌 Tabla: certificados
CREATE TABLE certificados (
id INT AUTO_INCREMENT PRIMARY KEY,
documento_id INT,
numero_serie VARCHAR(100),
emisor VARCHAR(255),
sujeto VARCHAR(255),
fecha_inicio DATETIME,
fecha_fin DATETIME,
rfc VARCHAR(20),
FOREIGN KEY (documento_id) REFERENCES documentos_firmados(id)
);
📌 Tabla: validaciones_ocsp
CREATE TABLE validaciones_ocsp (
id INT AUTO_INCREMENT PRIMARY KEY,
documento_id INT,
estado ENUM('good','revoked','unknown'),
respuesta_completa TEXT,
fecha_consulta DATETIME,
FOREIGN KEY (documento_id) REFERENCES documentos_firmados(id)
);
📌 Tabla: constancias_nom151
CREATE TABLE constancias_nom151 (
id INT AUTO_INCREMENT PRIMARY KEY,
documento_id INT,
hash VARCHAR(64),
sello_tiempo TEXT,
proveedor VARCHAR(255),
archivo_constancia VARCHAR(500),
fecha_generacion DATETIME,
FOREIGN KEY (documento_id) REFERENCES documentos_firmados(id)
);
📌 Tabla: logs_validacion (auditoría)
CREATE TABLE logs_validacion (
id INT AUTO_INCREMENT PRIMARY KEY,
documento_id INT,
evento VARCHAR(255),
descripcion TEXT,
fecha DATETIME
);
🔄 3️⃣ Flujo del sistema (lo importante)
SUBIR DOCUMENTO
↓
GUARDAR ARCHIVO
↓
GENERAR HASH (SHA-256)
↓
EXTRAER CERTIFICADO
↓
VALIDAR FIRMA (OpenSSL)
↓
CONSULTAR OCSP
↓
GUARDAR RESPUESTA
↓
GENERAR CONSTANCIA NOM-151
↓
GUARDAR TODO
↓
RESPUESTA FINAL
🌐 4️⃣ Endpoints (como te gusta trabajar con POST)
📌 1. Subir y validar documento
POST /firma/procesar.php
Parámetros:
archivo = PDF
📌 2. Ver resultado
POST /firma/consultar.php
documento_id
📌 3. Descargar constancia
GET /firma/constancia.php?id=1
🧠 5️⃣ Lógica principal (controlador)
FirmaController.php
public function procesar()
{
$archivo = $_FILES['archivo'];
// 1. Guardar archivo
$ruta = "storage/documentos/" . $archivo['name'];
move_uploaded_file($archivo['tmp_name'], $ruta);
// 2. Hash
$hash = hash_file('sha256', $ruta);
// 3. Extraer certificado
$cert = ValidadorFirma::extraerCertificado($ruta);
// 4. Validar firma
$firmaValida = ValidadorFirma::validar($ruta);
// 5. OCSP
$ocsp = OcspService::consultar($cert);
// 6. Guardar BD
$docId = FirmaModel::guardarDocumento($ruta, $hash);
FirmaModel::guardarCertificado($docId, $cert);
FirmaModel::guardarOCSP($docId, $ocsp);
// 7. NOM-151
$constancia = Nom151Service::generar($hash);
FirmaModel::guardarConstancia($docId, $constancia);
return [
"status" => "ok",
"firma_valida" => $firmaValida,
"ocsp" => $ocsp
];
}
🔐 6️⃣ Servicio OCSP (clave)
OcspService.php
class OcspService {
public static function consultar($cert)
{
$cmd = "openssl ocsp
-issuer issuer.pem
-cert cert.pem
-url http://ocsp.sat.gob.mx
-CAfile raiz.pem";
$output = shell_exec($cmd);
if (strpos($output, 'good') !== false) {
return ['estado' => 'good', 'raw' => $output];
}
if (strpos($output, 'revoked') !== false) {
return ['estado' => 'revoked', 'raw' => $output];
}
return ['estado' => 'unknown', 'raw' => $output];
}
}
🧾 7️⃣ Servicio NOM-151 (simplificado)
Nom151Service.php
class Nom151Service {
public static function generar($hash)
{
// Simulación (en producción se conecta a proveedor PSC)
return [
"hash" => $hash,
"sello_tiempo" => date('Y-m-d H:i:s'),
"proveedor" => "PSC_CERT"
];
}
}
⚖ 8️⃣ Punto CRÍTICO (lo que te da blindaje)
Tu sistema debe guardar:
✔ Hash
✔ Certificado
✔ Respuesta OCSP completa
✔ Fecha exacta
✔ Constancia NOM-151
Eso convierte tu sistema en:
Sistema con capacidad probatoria
🧠 9️⃣ Mejora PRO (recomendación real)
Para nivel tribunal:
-
Ejecutar OpenSSL en servidor seguro
-
No confiar en
shell_execsin sanitizar -
Firmar la constancia interna del sistema
-
Controlar zona horaria oficial
-
Registrar IP y usuario
🎯 Conclusión
Con esta arquitectura:
✔ Ya tienes módulo real integrable a tu sistema actual
✔ Cumples con validación técnica
✔ Cumples con NOM-151
✔ Generas evidencia para juicio
✔ Reduces riesgo de nulidad
Si quieres, el siguiente paso puede ser 🔥:
-
🧩 Integrarlo con tu sistema actual de carpetas judiciales
-
🖥 Hacerte la vista en Bootstrap (tabla + modal) como ya usas
-
📊 O crear el reporte tipo constancia en PDF descargable
¿Con cuál seguimos?
Comentarios
Publicar un comentario