中間者攻撃を防ぐために、リクエストメッセージとレスポンスメッセージの両方が送信者によって署名され、受信者によって署名が検証される必要があります。
ZOLOZ サービスは各リクエストメッセージの署名を強制的に検証するため、加盟店はリクエストに適切に署名する必要があります。 ZOLOZ サービスはレスポンスメッセージにも署名することが保証されていますが、レスポンスメッセージの署名検証は加盟店にとってオプションです。 ただし、加盟店はすべてのレスポンスに対して署名を検証することを強くお勧めします。
メッセージに署名する
メッセージ署名プロセスフロー
次の図は、加盟店の観点からリクエストメッセージに署名する方法と、ZOLOZ サービスの観点からレスポンスメッセージに署名する方法を示しています。

図 1. メッセージ署名アクティビティ図
メッセージに署名する手順
次の手順は、メッセージに署名する方法を示しています。
1. 秘密鍵を取得する
メッセージに署名するには、秘密鍵を使用する必要があります。
リクエストメッセージの場合、加盟店側で RSA 2048 キーペアを生成する必要があります。 生成されたキーペアには秘密鍵が含まれています。 加盟店は秘密鍵を使用してリクエストメッセージに署名します。
レスポンスメッセージの場合、加盟店のアカウントが作成されるときに ZOLOZ システムで RSA 2048 キーペアが生成されます。 生成されたキーペアは加盟店ごとに一意であり、秘密鍵が含まれています。 ZOLOZ サービスは秘密鍵を使用してレスポンスメッセージに署名します。
2. 署名するコンテンツを作成する
署名されるコンテンツは、メッセージがリクエストかレスポンスかによって異なるいくつかの要素で構成される文字列です。
リクエストメッセージの場合
加盟店によって署名される必要があるコンテンツ文字列は、次の形式で作成されます。
<Request Method> <Request URI>
<Client ID>.<Request Time>.<Request Body>したがって、次の文字列を順番に連結して、署名されるコンテンツ文字列を作成します。
リクエストメソッド
空白文字 ("")
リクエストされた URI
改行文字 ("\n")
クライアント ID
ドット文字 (".")
Request-Time ヘッダーフィールドに設定されているリクエスト時間です。
ドット文字 (".")
リクエスト本文
次の例は、加盟店によって署名されるコンテンツ文字列を示しています。
POST /api/v1/zoloz/authentication/test
2089012345678900.2020-01-01T08:00:00+0800.{
"title": "hello",
"description": "just for demonstration."
}レスポンスメッセージの場合
ZOLOZ サービスによって署名されるコンテンツ文字列は、加盟店によって検証されるコンテンツ文字列と同じです。詳細については、「検証されるコンテンツを構築する (応答メッセージの場合)」をご参照ください。
3. 署名を計算する
次の式を使用して署名を計算します。
SIGNATURE=base64urlsafe_encode(sha256withrsa_sign($CONTENT_TO_BE_SIGNED, $PRIVATE_KEY))使用されるメソッド:
sha256withrsa_sign: 提供されたコンテンツのデジタル署名を生成するメソッド。 詳細については、「: 提供されたコンテンツのデジタル署名を生成する方法です。詳細については、「sha256withrsa_sign」を参照してください。。base64urlsafe_encode: 生成されたデジタル署名をエンコードするメソッド。 詳細については、「: 生成されたデジタル署名をエンコードする方法です。詳細については、「base64urlsafe_encode」を参照してください。。
入力パラメーター:
CONTENT_TO_BE_SIGNED: ステップ 2 で作成されたコンテンツ文字列。: 構築されたコンテンツ文字列手順 2。PRIVATE_KEY: ステップ 1 で生成された秘密鍵。で生成された秘密鍵手順 1。
出力パラメーター:
SIGNATURE: 最終的に生成される署名文字列です。
4. ヘッダーに署名を構成する
生成された署名文字列を、Signature フィールドの HTTP リクエストまたはレスポンスヘッダーに、次の形式で指定します。
Signature: algorithm=RSA256, signature=<SIGNATURE>署名を検証する
署名検証プロセスフロー
次の図は、ZOLOZ サービスの観点からリクエストメッセージの署名を検証する方法と、加盟店の観点からレスポンスメッセージの署名を検証する方法を示しています。
図 2. 署名検証アクティビティ図
署名を検証する手順
次の手順は、署名を検証する方法を示しています。
1. 公開鍵を取得する
署名を検証するには、公開鍵を使用する必要があります。
リクエストメッセージの場合、ZOLOZ サービスが使用する公開鍵は、加盟店が生成した RSA 2048 キーペアからのものです。 公開鍵は、リクエストが送信される前に ZOLOZ システムに登録されている必要があります。 ZOLOZ サービスは、登録済みの公開鍵を使用して、加盟店からの各リクエストの署名を検証します。
レスポンスメッセージの場合、加盟店は ZOLOZ サービスが提供する公開鍵を取得する必要があります。 公開鍵は、加盟店のアカウントが作成されるときに ZOLOZ システムによって生成される RSA 2048 キーペアからのものです。 加盟店は公開鍵を使用して、ZOLOZ から返される各レスポンスの署名を検証します。
ZOLOZ システムでリクエスト用の公開鍵を登録する方法、または ZOLOZ システムからレスポンス用の公開鍵を取得する方法の詳細については、「API 認証情報を準備して使用する」をご参照ください。
2. 検証するコンテンツを作成する。
検証されるコンテンツは、メッセージがリクエストかレスポンスかによって異なるいくつかの要素で構成される文字列です。
リクエストメッセージの場合
ZOLOZ サービスによって検証されるコンテンツ文字列は、加盟店によって署名されたコンテンツ文字列と同じです。 詳細については、「」セクションを参照してください。署名対象のコンテンツを作成する (リクエスト メッセージの場合) 詳細については、
レスポンスメッセージの場合
加盟店によって検証される必要があるコンテンツ文字列は、次の形式で作成されます。
<Request Method> <Request URI>
<Client ID>.<Response Time>.<Response Body>したがって、次の文字列を順番に連結して、検証されるコンテンツ文字列を作成します。
リクエストメソッド
空白文字 ("")
リクエストされた URI
改行文字 ("\n")
クライアント ID
ドット文字 (".")
Response-Time ヘッダーフィールドに設定されている応答時間
ドット文字 (".")
レスポンス本文
次の例は、検証されるコンテンツ文字列を示しています。
POST /api/v1/zoloz/authentication/test
2089012345678900.2020-01-01T08:00:01+0800.{
"title": "hello",
"description": "just for demonstration."
}3. ヘッダーから署名を抽出する
HTTP リクエストまたはレスポンスヘッダーの Signature フィールドから署名を抽出します。
Signature: algorithm=RSA256, signature=<SIGNATURE_TO_BE_EXTRACTED>4. 署名を検証する
次の式を使用して、抽出された署名が検証対象のコンテンツ文字列と一致するかどうかを確認します。
IS_SIGNATURE_VALID=sha256withrsa_verify($CONTENT_TO_BE_VALIDATED, base64urlsafe_decode($SIGNATURE), $PUBLIC_KEY))使用されるメソッド:
base64urlsafe_decode: ステップ 3 で抽出された署名をデコードするメソッド。 詳細については、「:手順 3 で抽出された署名をデコードする方法です。詳細については、「base64urlsafe_decode」を参照してください。。sha256withrsa_verify: 署名を検証するメソッド。 詳細については、「: 署名を検証する方法です。詳細については、「sha256withrsa_verify」を参照してください。。
入力パラメーター:
CONTENT_TO_BE_VALIDATED: ステップ 2 で作成されたコンテンツ文字列。で構築されたコンテンツ文字列手順 2。SIGNATURE: ステップ 3 で抽出された署名文字列。: 抽出された署名文字列手順 3。PUBLIC_KEY: ステップ 1 で取得された公開鍵。: フェッチされた公開鍵手順 1。
出力パラメーター:
IS_SIGNATURE_VALID: 抽出された署名が検証対象のコンテンツ文字列と一致するかどうかを指定するブール値です。
