Certificados e mTLS
Ciclo de vida do certificado e tokens vinculados a certificado
O Directory opera a própria autoridade certificadora e, em cima dela, tokens de sessão e de credencial de serviço vinculados a certificado (RFC 8705).
Emissão de certificado
POST /admin/institutions/{id}/certificates emite um certificado X.509 (RSA-2048, válido tanto pra ServerAuth quanto ClientAuth) assinado pela CA raiz do Directory. A chave privada é devolvida uma única vez, no corpo da resposta, e nunca é armazenada — perdê-la significa emitir um certificado novo, não recuperar o antigo.
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"
}
Revogação
POST /admin/institutions/{id}/certificates/{serialNumber}/revoke vira o status do certificado pra REVOKED. A listagem pública em GET /organisations/{id}/certificates reflete o status atual de todo certificado que uma instituição já recebeu — ativo ou revogado.
Tokens vinculados a certificado (RFC 8705)
Um token Bearer — uma sessão de POST /login, ou uma credencial de serviço de POST .../service-credential — pode ser vinculado a um certificado de cliente mTLS apresentado no momento em que é emitido. Uma vez vinculado, toda requisição autenticada seguinte precisa apresentar o mesmo certificado, ou a requisição é recusada mesmo com um token Bearer válido. O certificado não precisa ser emitido por nenhuma CA em particular — autoassinado é suficiente, já que este mecanismo vincula um token a um par de chaves, não autentica via cadeia de confiança.
# 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 (uma configuração de implantação, desligada por padrão) torna a apresentação de certificado obrigatória em /login, /register e na emissão de /service-credential. Um vínculo já gravado numa sessão ou credencial existente é imposto independente desta configuração — ligá-la depois nunca invalida um participante que já vinha apresentando um certificado por conta própria.