署名検証
説明
Rakuten CPaaSは、サーバーからアプリケーションサーバーへのすべてのHTTPリクエストに署名し、最終リクエストURL(スキーム、ポート、クエリ文字列を含む完全なURL)とPOSTパラメータを連結してアプリケーションサーバーへのリクエストを構成し、以下の手順に従って署名を生成します。
受信時、Rakuten CPaaSからの受信Webhookには署名と、アプリケーション内で署名を生成して2つの署名が一致するか検証するために必要なすべてのフィールドが含まれます。リクエスト内の他のパラメータを使用してSIGNATURE_SECRETで署名を生成し、送信された署名と比較します。2つが一致すれば、リクエストは有効です。
SIGNATURE_SECRETはPASSWORDとは異なり、アカウントマネージャーから提供されます。
以下は、署名を生成し、ヘッダーで受信した署名と検証するための手順です。
ステップ 1: リクエストメソッド
HTTPリクエストメソッドを取得します。例: GET, PUT, HEAD, DELETE
ステップ 2: ヘッダー検証
すべての必須ヘッダーの存在を確認します。
パラメータ | 説明 |
---|---|
host | Webhookのドメイン(例: api.cpaas.symphony.rakuten.net) |
x-api-signature-algorithm | サポートされているアルゴリズム - hmac-sha256 - hmac-sha512 |
x-api-signature-version | デフォルト: 1.0 |
x-api-signature-keyid | デフォルト: 2 |
x-security-signature-timestamp | 現在のタイムスタンプ(UTC)形式 = YYYY-MM-DD HH:mm:ss(例: 2025-03-13 12:24:14) |
x-api-nonce | 擬似乱数(例: sbXrFfa1zyrAC5huBeIqKi86tOPrg8ffOw) |
x-api-payload-digest | ペイロードが存在する場合に設定されます |
x-api-signature | HEX形式の署名 |
ステップ 3: リクエストパス
完全なURLパスからリクエストパスを取得します。例: /v1/resources
ステップ 4: クエリ文字列
**"?"**なしのURLパラメータを取得します。パラメータがない場合は空の文字列になります(例: param1=value1¶m2=value2)
ステップ 5: タイムスタンプ検証
1. X-Security-Signature-Timestampからタイムスタンプを解析します。
2. 現在のサーバー時間との差を計算します。
3. 差が5分を超える場合は拒否します。
4. タイムゾーンの違いや時計の同期を考慮します。
ステップ 6: ペイロードダイジェスト検証
1. HTTPヘッダーを読み取り、X-API-Payload-Digestを取得し、小文字に変換します。
2. SHA256を使用してボディをエンコードし、計算されたペイロードダイジェストを取得します。
3. 計算された値を小文字に変換します。
4. X-API-Payload-Digestと計算されたペイロードダイジェストを比較します。
ステップ 7: 署名文字列再構築
以下の順序でコンポーネントを**":"**区切りで連結して署名文字列を再構築します。
1. HTTPメソッド(大文字)例: POST
2. ホストヘッダーからのホスト(例: api.cpaas.symphony.rakuten.net)
3. 完全なURLパスからのリクエストパス(例: /v1/resources)
4. クエリ文字列(例: "param1=value1¶m2=value2")
5. ペイロードダイジェスト
- ペイロードのSHA-256ハッシュ
- ペイロードがない場合は空の文字列
- 例: "a1b2c3d4…"
6. X-API-Signature-Algorithmからのアルゴリズム(例: hmac-sha256)
7. X-API-Signature-Versionからのバージョン(例: 1.0)
8. X-API-Signature-KeyIdからのキーID(例: 2)
9. X-Security-Signature-Timestampからのタイムスタンプ(例: 2025-03-11 10:00:00)
10. X-API-Nonceからのノンス(例: abc123xyz789)
重要なルール:
1. コンポーネントの順序を正確に維持すること
2. コロン「:」区切りを使用すること。連結された文字列の末尾にはトレーリング「:」があります
3. 区切り文字の周りにスペースを入れないこと
4. 空の値には区切り文字を含めること
5. 大文字と小文字を区別する値
形式の例:
POST:api.cpaas.symphony.rakuten.net:/v1/resources:param1=value1¶m2=value2:a1b2c3d4...:hmac-sha256:1.0:2:2025-03-11 10:00:00:abc123xyz789:
ステップ 8: 署名生成
**HMAC-SHA256 (String, Signature Key)**を使用してエンコードし、HEXバイトに変換します。
ここで、Signature KeyはRakuten CPaaSから受け取ったSIGNATURE_SECRETです。
ステップ 9: 署名検証
Rakuten CPaaSから受信したヘッダーのX-API-Signatureと、上記で計算した署名を比較します。