メインコンテンツまでスキップ

署名検証

説明

Rakuten CPaaSは、サーバーからアプリケーションサーバーへのすべてのHTTPリクエストに署名し、最終リクエストURL(スキーム、ポート、クエリ文字列を含む完全なURL)とPOSTパラメータを連結してアプリケーションサーバーへのリクエストを構成し、以下の手順に従って署名を生成します。

受信時、Rakuten CPaaSからの受信Webhookには署名と、アプリケーション内で署名を生成して2つの署名が一致するか検証するために必要なすべてのフィールドが含まれます。リクエスト内の他のパラメータを使用してSIGNATURE_SECRETで署名を生成し、送信された署名と比較します。2つが一致すれば、リクエストは有効です。

SIGNATURE_SECRETPASSWORDとは異なり、アカウントマネージャーから提供されます。

以下は、署名を生成し、ヘッダーで受信した署名と検証するための手順です。

ステップ 1: リクエストメソッド

HTTPリクエストメソッドを取得します。例: GET, PUT, HEAD, DELETE

ステップ 2: ヘッダー検証

すべての必須ヘッダーの存在を確認します。

パラメータ説明
hostWebhookのドメイン(例: 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-signatureHEX形式の署名

ステップ 3: リクエストパス

完全なURLパスからリクエストパスを取得します。例: /v1/resources

ステップ 4: クエリ文字列

**"?"**なしのURLパラメータを取得します。パラメータがない場合は空の文字列になります(例: param1=value1&param2=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&param2=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&param2=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と、上記で計算した署名を比較します。