
# İmza anahtarı politikasını güncelle

`PATCH /v1/signing-keys/policy` · izin `signing-keys:write`

İmza anahtarı politikasını JSON merge patch ile günceller (`application/merge-patch+json`, RFC 7396). `If-Match` zorunludur: yoksa `428`, eski sürümse `412`. Politika hiç yazılmadıysa sürüm `"0"`'dır. Hiçbir şeyi değiştirmeyen yama yazma yapmaz ve sürümü korur.

`algorithm` değişince yeni algoritmayla yeni bir `next` anahtar hemen üretilir; JWKS'i önbelleğe alan doğrulayıcılar onu önce görsün diye en erken 7 gün sonra etkinleşebilir (daha erken `immediate` rotasyon `409 next_key_too_young` ile başarısız olur). O zamana dek etkin anahtar imzalamayı sürdürür. `rotation_interval_days` değişince `next_rotation_at` kayar. Başarılı değişiklik `signing_key.policy_updated` yönetim audit kaydını yazar.

## İstek

| Alan | Tür | Zorunlu | Açıklama |
|---|---|---|---|
| `If-Match` | header | evet | Politikanın son okunan `ETag`'i (hiç yazılmadıysa `"0"`). Yoksa `428`; eskiyse `412`. |
| `algorithm` | string | hayır | `RS256`, `ES256`, `PS256` ya da `EdDSA`. `null` olamaz. |
| `rotation_interval_days` | integer | hayır | 30-365. `null` olamaz. |
| `storage` | string | hayır | `wrapped` (özel anahtar ortam anahtarıyla şifreli saklanır ve yalnız imza servisinin içinde kullanılır). `transit` (anahtar anahtar yönetim servisinde tutulur) henüz kullanılamaz ve `422` ile reddedilir. `null` olamaz. |

## Yanıt

`200 OK`; güncellenmiş politika ve yeni `ETag`.

```json
{
  "algorithm": "ES256",
  "rotation_interval_days": 90,
  "storage": "wrapped",
  "next_rotation_at": "2026-12-04T09:30:00.123456Z",
  "updated_at": "2026-10-05T09:30:00.123456Z"
}
```

## Hatalar

| HTTP | code | Ne zaman |
|---|---|---|
| 400 | `unknown_field` | Yamada bilinmeyen ya da salt okunur alan var veya yama JSON nesnesi değil (`malformed_request`). |
| 412 | `precondition_failed` | `If-Match` güncel sürümle eşleşmiyor. |
| 415 | `unsupported_media_type` | İçerik türü `application/merge-patch+json` değil. |
| 422 | `validation_failed` | Bir değer geçersiz (`invalid_value`), aralık dışında (`out_of_range`), `null` verilmiş (`invalid`) ya da `storage` `transit`. |
| 428 | `precondition_required` | `If-Match` başlığı yok. |
| 401 | `unauthenticated` | Kimlik bilgisi yok, geçersiz ya da iptal edilmiş. |
| 403 | `insufficient_permissions` | Kimlik bilgisinde gerekli izin yok. |
| 429 | `rate_limited` | Hız sınırı aşıldı; `Retry-After` süresinden sonra yeniden deneyin. |
| 501 | `not_implemented` | İşlem bu dağıtımda henüz kullanılamıyor; yeniden denemek sonucu değiştirmez. |
| 503 | `service_unavailable` | Bir bağımlılık geçici olarak kullanılamıyor; `Retry-After` süresinden sonra yeniden deneyin. |

## Örnek

```bash
curl -X PATCH https://api.eu.keenauth.com/v1/signing-keys/policy \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY" \
  -H "Content-Type: application/merge-patch+json" \
  -H 'If-Match: "0"' \
  -d '{"algorithm":"ES256","rotation_interval_days":90}'
```
