Saltar a contenido

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.)