
# Ajouter un certificat de signature IdP à une connexion

`POST /v1/connections/{connection_id}/certificates` · autorisation `connections:write`

Ajoute un certificat de signature du fournisseur d'identité à une connexion SAML d'entreprise. Utilisez-le pour envoyer le certificat à la main ou pour faire tourner les certificats : ajoutez d'abord le nouveau certificat, basculez le fournisseur d'identité, puis [supprimez](delete.md) l'ancien. La rotation prend effet immédiatement, y compris sur une connexion active.

Le certificat est un bloc PEM `CERTIFICATE` (8 KiB au plus). Il ne doit pas être expiré et doit avoir une clé RSA d'au moins 2048 bits ou une clé ECDSA P-256, P-384 ou P-521. Lorsqu'il est refusé, la réponse n'indique pas la raison, et ni la raison ni le contenu du certificat ne sont journalisés. Une connexion compte au plus 3 certificats actifs. Un certificat supprimé de la connexion ne peut pas être ajouté à nouveau. La requête n'accepte pas d'en-tête `If-Match`. Les écritures sont auditées sous `connection.idp_certificate_added`.

## Requête

| Champ | Type | Obligatoire | Description |
|---|---|---|---|
| `connection_id` | chemin | oui | ID de connexion SAML d'entreprise (`conn_…`). |
| `certificate` | chaîne | oui | Un certificat PEM (`-----BEGIN CERTIFICATE-----` …), 8 KiB au plus. |

## Réponse

`201 Created` avec le nouveau certificat (voir [Lister les certificats](list.md)). Lorsque le même certificat est déjà présent sur la connexion, la réponse est `200 OK` avec le certificat enregistré ; rien n'est écrit ni audité.

```json
{"id": "conncert_01j9xq2m4n6p8r0s2t4v6w8y0a", "sha256_fingerprint": "3b0c…", "not_before": "2026-01-01T00:00:00Z", "not_after": "2028-01-01T00:00:00Z", "source": "manual"}
```

## Erreurs

| HTTP | code | Quand |
|---|---|---|
| 404 | `not_found` | La connexion n'existe pas dans cet environnement ou n'est pas une connexion d'entreprise. |
| 409 | `conflict` | La connexion n'est pas une connexion SAML, n'a pas encore de configuration SAML, a déjà 3 certificats actifs, ou le certificat a été supprimé de la connexion auparavant. |
| 422 | `validation_failed` | Le certificat est absent, trop volumineux ou non accepté ; `errors[]` pointe vers `/certificate`. Les environnements de préproduction et de production refusent aussi un certificat correspondant à la clé de test publique du [serveur de simulation local](/docs/cli/mock-server). |
| 400 | `unknown_field` | Le corps contient un champ inconnu. |
| 401 | `unauthenticated` | L'identifiant est absent, invalide ou révoqué. |
| 403 | `insufficient_permissions` | L'identifiant ne dispose pas de l'autorisation requise. |
| 429 | `rate_limited` | La limite de débit a été dépassée ; réessayez après la durée indiquée par `Retry-After`. |
| 503 | `service_unavailable` | Une dépendance est temporairement indisponible ; réessayez après la durée indiquée par `Retry-After`. |

## Exemple

```bash
jq -Rs '{certificate: .}' idp-signing.pem > cert.json
curl -X POST "https://api.eu.keenauth.com/v1/connections/conn_01j9xp6q0r1s5t7v9w1x3y5z7b/certificates" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d @cert.json
```

```bash
keenauth connections certificates add conn_01j9xp6q0r1s5t7v9w1x3y5z7b --certificate-file idp-signing.pem
```
