Certificados y mTLS
Ciclo de vida del certificado y tokens vinculados a certificado
Directory opera su propia autoridad certificadora y, sobre ella, tokens de sesión y de credencial de servicio vinculados a certificado (RFC 8705).
Emisión de certificado
POST /admin/institutions/{id}/certificates emite un certificado X.509 (RSA-2048, válido tanto para ServerAuth como ClientAuth) firmado por la CA raíz de Directory. La clave privada se devuelve una sola vez, en el cuerpo de la respuesta, y nunca se almacena — perderla significa emitir un certificado nuevo, no recuperar el anterior.
curl -X POST https://directory.open.dev.br/admin/institutions/{institutionId}/certificates \
-H "Authorization: Bearer {sessionToken}"
{
"certPem": "-----BEGIN CERTIFICATE-----...",
"keyPem": "-----BEGIN RSA PRIVATE KEY-----...",
"serialNumber": "4F3A9C...",
"subjectDn": "CN=Example Bank,O=Example Bank"
}
Revocación
POST /admin/institutions/{id}/certificates/{serialNumber}/revoke cambia el estado del certificado a REVOKED. El listado público en GET /organisations/{id}/certificates refleja el estado actual de cada certificado que una institución haya recibido alguna vez — activo o revocado.
Tokens vinculados a certificado (RFC 8705)
Un token Bearer — una sesión de POST /login, o una credencial de servicio de POST .../service-credential — puede vincularse a un certificado de cliente mTLS presentado en el momento en que se emite. Una vez vinculado, toda solicitud autenticada posterior debe presentar el mismo certificado, o la solicitud se rechaza incluso con un token Bearer válido. El certificado no necesita ser emitido por ninguna CA en particular — uno autofirmado es suficiente, ya que este mecanismo vincula un token a un par de claves, no autentica mediante una cadena de confianza.
# Generate a certificate — any CA, including none, works
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout client.key -out client.crt -days 3650 \
-subj "/CN=example-bank"
# Presenting it at login binds the session it returns
curl --cert client.crt --key client.key \
-X POST https://directory.open.dev.br/login \
-d '{ "email": "admin@example.com", "password": "..." }'
# Every later call with that session must present the same certificate
curl --cert client.crt --key client.key \
https://directory.open.dev.br/admin/institutions/{institutionId} \
-H "Authorization: Bearer {sessionToken}"
DIRECTORY_REQUIRE_MTLS_BINDING (una configuración de implementación, desactivada por defecto) hace obligatorio presentar un certificado en /login, /register y al emitir /service-credential. Un vínculo ya registrado en una sesión o credencial existente se exige independientemente de esta configuración — activarla más tarde nunca invalida a un participante que ya presentaba un certificado voluntariamente.