Certificados¶
Gestiona certificados digitales PKCS#12 (.p12) asociados a un dni. Todos los endpoints requieren token (Authorization: Bearer <token>).
Cada dni puede tener varios certificados en la tabla certificates, pero solo uno puede estar marcado como principal (principal = true) a la vez: al subir un nuevo .p12 para un dni, el certificado anterior pierde ese estado. El certificado principal es el que usan los endpoints de firma (/api/doc/sign-by-label, /api/doc/sign-by-coord).
Endpoints¶
Base URL: /api/cert
| Método | Ruta | Auth | Body/Params | Descripción |
|---|---|---|---|---|
| POST | /encrypt | Sí | Param data o body { "data": "..." } | Cifra el valor recibido (AES-GCM) y crea un registro de certificado con la contraseña cifrada. |
| PUT | /upload-p12 | Sí (ROLE_ADMIN/ROLE_SUPER) | Multipart file (.p12, content-type application/x-pkcs12), password, certId, dni | Carga/actualiza el certificado PKCS#12 identificado por certId y lo marca como principal del dni. |
upload-p12 requiere que el usuario autenticado tenga rol ROLE_ADMIN o ROLE_SUPER (verificado leyendo el claim role del token); de lo contrario responde 401 UNAUTHORIZED.
El parámetro password de upload-p12 no es la contraseña en texto plano del .p12: es el valor passwordEncrypted devuelto por /api/cert/encrypt (el servidor lo desencripta internamente antes de abrir el keystore). Ver el flujo completo en Casos de uso: alta de usuario y certificado.
Ejemplos¶
1. Cifrar la contraseña del .p12¶
curl -X POST "http://localhost:8080/api/cert/encrypt?data=MiClaveP12Secreta" \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..."
Respuesta 201 CREATED:
{
"message": "Data encrypted successfully.",
"certId": 7,
"passwordEncrypted": "AbCdEf123==:GhIjKl456==",
"status": "SUCCESS"
}
Esto crea un registro en certificates con id = certId y la contraseña ya cifrada, listo para el siguiente paso.
2. Subir el archivo .p12¶
curl -X PUT http://localhost:8080/api/cert/upload-p12 \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiJ9..." \
-F "file=@certificado.p12;type=application/x-pkcs12" \
-F "password=AbCdEf123==:GhIjKl456==" \
-F "certId=7" \
-F "dni=12345678"
Respuesta 201 CREATED (entidad acCertificate completa):
{
"id": 7,
"name": "3c1e2f1a-....p12",
"expiresCert": "2027-01-01T00:00:00.000+00:00",
"registered": "2026-07-14T10:00:00.000+00:00",
"owner": "JUAN PEREZ",
"dniUser": "12345678",
"company": "Empresa SAC",
"jobTitle": "Gerente",
"principal": true,
"isValid": true,
"isRevoked": false
}
El campo dniCert (DNI extraído del propio certificado) no se serializa (@JsonIgnore).
Errores posibles:
| Código | Causa |
|---|---|
| 400 BAD_REQUEST | Archivo vacío, certId no existe, o contentType distinto de application/x-pkcs12 |
| 401 UNAUTHORIZED | Token sin rol ROLE_ADMIN/ROLE_SUPER, o claims no parseables |
| 500 INTERNAL_SERVER_ERROR | Certificado inválido por fecha, revocado, o cualquier error al leer el keystore (contraseña incorrecta, formato corrupto, etc.) |