
# 署名鍵ポリシーを更新

`PATCH /v1/signing-keys/policy` · 権限 `signing-keys:write`

JSON merge patch (`application/merge-patch+json`、RFC 7396) で署名鍵ポリシーを更新します。`If-Match` は必須です。ない場合は `428`、古いバージョンの場合は `412` です。ポリシーが一度も書き込まれていない場合、バージョンは `"0"` です。何も変更しないパッチは書き込みを行わず、バージョンを維持します。

`algorithm` を変更すると、新しいアルゴリズムの `next` 鍵がすぐに生成されます。JWKS をキャッシュする検証者が先に認識できるよう、この鍵が有効になれるのは最短で 7 日後です (それより早い `immediate` ローテーションは `409 next_key_too_young` で失敗)。それまでは有効な鍵が署名を続けます。`rotation_interval_days` を変更すると `next_rotation_at` が移動します。変更が成功すると `signing_key.policy_updated` 管理監査レコードが書き込まれます。

## リクエスト

| フィールド | タイプ | 必須 | 説明 |
|---|---|---|---|
| `If-Match` | header | はい | 最後に読み取ったポリシーの `ETag` (一度も書き込まれていない場合は `"0"`)。ない場合: `428`、古い場合: `412`。 |
| `algorithm` | string | いいえ | `RS256`、`ES256`、`PS256`、`EdDSA` のいずれか。`null` にはできません。 |
| `rotation_interval_days` | integer | いいえ | 30～365。`null` にはできません。 |
| `storage` | string | いいえ | `wrapped` (秘密鍵は環境鍵で暗号化して保管され、署名サービス内でのみ使用されます)。`transit` (鍵管理サービスで保持する鍵) はまだ利用できず、`422` で拒否されます。`null` にはできません。 |

## レスポンス

`200 OK` と更新されたポリシー、新しい `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"
}
```

## エラー

| HTTP | コード | 概要 |
|---|---|---|
| 400 | `unknown_field` | パッチに未知または読み取り専用のフィールドがあるか、JSON オブジェクトではありません (`malformed_request`)。 |
| 412 | `precondition_failed` | `If-Match` が現在のバージョンと一致しません。 |
| 415 | `unsupported_media_type` | コンテンツタイプが `application/merge-patch+json` ではありません。 |
| 422 | `validation_failed` | 値が無効 (`invalid_value`)、範囲外 (`out_of_range`)、`null` に設定 (`invalid`)、または `storage` が `transit` です。 |
| 428 | `precondition_required` | `If-Match` ヘッダーがありません。 |
| 401 | `unauthenticated` | 認証情報が見つからない、無効、または取り消されています。 |
| 403 | `insufficient_permissions` | 認証情報に必要な権限がありません。 |
| 429 | `rate_limited` | レート制限を超えました。`Retry-After` 期間後に再試行してください。 |
| 501 | `not_implemented` | この操作はこのデプロイではまだ利用できません。再試行しても結果は変わりません。 |
| 503 | `service_unavailable` | 依存関係が一時的に利用できません。`Retry-After` 期間後に再試行してください。 |

## 例

```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}'
```
