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

認証

RSA認証

署名リクエスト

  1. あなたの秘密鍵を生成し、appRsaPrivateKey として表し、リクエストの署名に使用します。長さは2048です。
  2. 署名する文字列 Content_To_Be_Signed を構築します。
  3. SHA256WithRSA 暗号化アルゴリズムを使用して署名を計算し生成します。
  4. 生成された署名をリクエストボディパラメータ sign に追加します。

各ステップの詳細については、以下の例を参照してください。

署名計算ステップ

1. 鍵ペアの生成

  • 署名にはRSAアルゴリズムを使用します。通信双方は一対のRSA鍵を生成し、公鍵を交換します。リクエスト時には秘密鍵を使用して署名し、リクエストを受け取った側は公鍵を使用して署名の有効性を検証します。リクエストには以下の方法で秘密鍵を生成し、生成された公鍵をCodePayにアップロードする必要があります。

Java言語を使用する場合、秘密鍵の形式はPKCS8です。他の言語ではPKCS1が使用されます。鍵の長さは2048です。公鍵の形式は通常PEMです。C#などの言語ではDER形式の公鍵が必要であり、これらの公鍵は変換が必要です。

  • RSA2鍵を生成する方法が分からない場合は、以下のツールを使用することをお勧めします。ワンクリックで鍵生成、署名生成、署名検証が可能です。

PayCloud Key Tool

PayCloud Key Toolを使用してRSA鍵ペアを生成
  • また、以下のようにopensslを使用して手動でRSA2鍵を生成することもできます。
# 1. Generating the private key
openssl genrsa -out client_private_key_php_dotnet.pem

# 2. If you are a Java developer, convert the private key to PKCS8 format, other development languages use the PKCS1 format
openssl pkcs8 -topk8 -inform PEM -in client_private_key_php_dotnet.pem -outform PEM -nocrypt -out client_private_key_pkcs8.pem

# 3. Generate the public key
openssl rsa -in client_private_key_php_dotnet.pem -pubout -out client_public_key_php_dotnet.pem

# 4. Generate the private key that can be used in Java
cat client_private_key_pkcs8.pem | grep -v "^\-" | tr -d "\n" | sed 's/%$//' > client_private_key_java.pem

# 5. Generate the public key that can be used in Java
cat client_public_key_php_dotnet.pem | grep -v "^\-" | tr -d "\n" | sed 's/%$//' > client_public_key_java.pem

2. 署名対象文字列の構築

Step 1: 署名対象のパラメータを構築

署名対象のパラメータには、APIリクエストパラメータ、レスポンスパラメータ、非同期通知パラメータが含まれます(ただし、署名パラメータsignや値がNULLまたは空文字列のパラメータは含まれません)。

ヒント

HTTPプロトコルの要件に従い、GETリクエストでパラメータの値に特殊文字(例:&、@など)が含まれる場合、その値はURLエンコードされる必要があります。しかし、署名するデータにはエンコード前の元の値を使用します

String [] parameters={
"app_id=wzxxxxxxxxxx",
"method=pay.orderquery",
"format=JSON",
"charset=UTF-8",
"sign_type=RSA2",
"version=1.0",
"timestamp=1908901287917",
"merchant_no=M100001876",
"description="
};

処理後、署名に参加するパラメータは以下の通りです(ルールに基づき、空のab_no値は署名に含まれません):

String [] parameters={
"app_id=wzxxxxxxxxxx",
"method=pay.orderquery",
"format=JSON",
"charset=UTF-8",
"sign_type=RSA2",
"version=1.0",
"timestamp=1908901287917",
"merchant_no=M100001876"
};
注意

JSONオブジェクトのキーは順序が保証されていないため、この署名ルールではJSONの最上位レベルのキーと値のみを選択します。ネストされたJSONオブジェクトの場合、署名計算とHTTPメッセージの送信前に、JSONの値を文字列に変換してください。

これは誤ったJSONメッセージです。key3の値がJSONObjectであり、文字列に変換されていません。

{
"key1":"value1",
"key2":"value2",
"key3":{
"subkey31":"subvalue31",
"subkey32":"subvalue32"
}
}

これは正しいJSONメッセージです。key3の値は文字列に変換されたJSONObjectです:

{
"key1":"value1",
"key2":"value2",
"key3":"{\"subkey31\":\"subvalue31\",\"subkey32\":\"subvalue32\"}"
}

Step 2: パラメータのソート

パラメータ名をASCIIコードの最小から最大の順(aからzの順、最初の文字が同じ場合は次の文字を比較)でソートします。たとえば、JAVA言語では関数「Collections.sort(keys)」を使用してソートできます。 最初のソート後の配列は次のとおりです:

String[] parameters={
"app_id=wzxxxxxxxxxx",
"charset=UTF-8",
"format=JSON",
"merchant_no=M100001876",
"method=pay.orderquery",
"sign_type=RSA2",
"timestamp=1908901287917",
"version=1.0"
};

Step 3: パラメータの連結

前の例のように、ソートされたパラメータを「&」文字で結合します:

app_id=wzxxxxxxxxxx&charset=UTF-8&format=JSON&merchant_no=M100001876&method=pay.orderquery&sign_type=RSA2&timestamp=1908901287917&version=1.0

3. サイン関数を使用して署名を計算

第二のステップで得られた署名文字列に対して、あなたがよく知っている開発言語のRSA2署名アルゴリズム関数を使用して署名を計算します。私たちはSHA256WithRSAアルゴリズムを使用して署名計算を行います。

sign=base64UrlEncode(sha256withrsa(<Content_To_Be_Signed>), <appRsaPrivateKey>));

以下の例は、署名関数の計算結果が正しいかどうかを検証するのに役立ちます:

1. My PKCS8 private key is:MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCJ9N8YTm0wEuBye5zSiZKncNIg6WBvTHjg4dYc9BH0zR+LeHd/jVo+InrMiIFgblnf7eYJ/wlPG5cSMMSyQMHj/7o0prc+VZsqi1mjX88InK4qDl6qFBFrg4dRrCAwILLVOP/ppUU3souMmnYnvOSUyuLBnhSno8qTpFSbcFAkPaHRmUmcTtVPWuNNbPaZVlNn81imIIVw8LKzOzCz9CNNcikkvbUlZp/cZ0Fl3s6icqOCjRvamg8KLZJs9D52S20X60ynreEIn8g6lr77byOGCCRwpdMl9Cl89WmbC3A3RKh7GRPtjyx3B5aQqE3sK5sNT8H8/EqcnQe8QoVBs7x1AgMBAAECggEAbE6vB+oqlt97DuY1TKVtWb+dePFAIKEtFYC4FKsZndOcvGaripxzCO0Q85sH16lLLh8bxyVPLag/hqx7AGcO0e1nRwbMPkf/NfuJOFZzuBMqOSJm96ghtQLiLiCwdJh3Ticd41U5bmziWlS6BqCp5JcUR2XQWXyiAh+1vQMEKC56CNPxr7imXITS7BYdY0qiGiOANcoEJhfQXn4BjzEm2FJufdlHW6/IeRYZ874HF3/7aUOyhbnapxYHU9PzicMc9XwerMcXMGvOfTUnCtRVONLn7jiknbpwdZ1d8PoItUZuaXdAyY6wFHZF+KvyrEoOV0eWRYzPgku2oSMD7IckUQKBgQDy+etogil+3F8S/qW1WiG6l2tLx5cwq3Ak9weN1zOo8A43obtXRxW2b4fDeol8y6LmYaIW9kKmK0qHEx5LoUSH7VN3FigNpFSa6muVJUuY+ob4H3Je+h3PaqbwhVFzjDofuIolPiJZW64LaFPZcxxD9vM2tZ6txLeMUmGftPoVSwKBgQCRWeNxbvTs8U5UknrdDZHUwXUmy5Qg2LUzxDXdbZXgolMh0AgDShcEFvaF+G3OFHj9vovytt0HtEXyC9LEc6w/a08mtGHiAJbjyjrJCHRNrcFflEm1xseIqXQXDj5Tw05XkAnlWN+r0w3Ix45+GrNhMOGfDkVyQeYI5Jsxxt0dPwKBgFJwcWr4HtQoOSnctKSffCovDfycL7QXtukT18BMb/611F0TxtiKCdfoZ4vvm454GUFJhxF7ZIm0zoid9/15LiNgZp1VKynVw878Epx8FvZEql6tbMTE4DBr41BgK46k2WPB3T1do5HmBVthfnGdGM4Gj+bUII6c3BoEKZNieCeZAoGAQ3rx5wXWW/KjpQvkUqAsJhQyqXI2MRGq/n+Hamen/4QdCEOmlLBfAx0OEqCFifljOpquKl7POvZsyrTGg0IYo9DUDGoOT3hqlRKcPBzasf2LGy6jEetZU48oQFPyh7zSsEBE999M6F6xtZdABjerM+IXvVpIz4TcoSBRFMj4es0CgYEAiNCbs2YPKBFpJq9EYsSsx0GwXAItXFAM71TogWs/8InGNq0PYRZTn9Lq6mFEyLkFql1zWQkS7CG3uDPBV+V2G4MbvoZeFgiQmly7uMQJwbEiKjJBsOzkYY2ZhFYLjGUpGer2U82XeEU6F/Vh4FLkVEE2iB3nPpVQs0qPZxfFZvM=

2. My PKCS1 private key is:MIIEowIBAAKCAQEAifTfGE5tMBLgcnuc0omSp3DSIOlgb0x44OHWHPQR9M0fi3h3f41aPiJ6zIiBYG5Z3+3mCf8JTxuXEjDEskDB4/+6NKa3PlWbKotZo1/PCJyuKg5eqhQRa4OHUawgMCCy1Tj/6aVFN7KLjJp2J7zklMriwZ4Up6PKk6RUm3BQJD2h0ZlJnE7VT1rjTWz2mVZTZ/NYpiCFcPCyszsws/QjTXIpJL21JWaf3GdBZd7OonKjgo0b2poPCi2SbPQ+dkttF+tMp63hCJ/IOpa++28jhggkcKXTJfQpfPVpmwtwN0SoexkT7Y8sdweWkKhN7CubDU/B/PxKnJ0HvEKFQbO8dQIDAQABAoIBAGxOrwfqKpbfew7mNUylbVm/nXjxQCChLRWAuBSrGZ3TnLxmq4qccwjtEPObB9epSy4fG8clTy2oP4asewBnDtHtZ0cGzD5H/zX7iThWc7gTKjkiZveoIbUC4i4gsHSYd04nHeNVOW5s4lpUugagqeSXFEdl0Fl8ogIftb0DBCguegjT8a+4plyE0uwWHWNKohojgDXKBCYX0F5+AY8xJthSbn3ZR1uvyHkWGfO+Bxd/+2lDsoW52qcWB1PT84nDHPV8HqzHFzBrzn01JwrUVTjS5+44pJ26cHWdXfD6CLVGbml3QMmOsBR2Rfir8qxKDldHlkWMz4JLtqEjA+yHJFECgYEA8vnraIIpftxfEv6ltVohupdrS8eXMKtwJPcHjdczqPAON6G7V0cVtm+Hw3qJfMui5mGiFvZCpitKhxMeS6FEh+1TdxYoDaRUmuprlSVLmPqG+B9yXvodz2qm8IVRc4w6H7iKJT4iWVuuC2hT2XMcQ/bzNrWercS3jFJhn7T6FUsCgYEAkVnjcW707PFOVJJ63Q2R1MF1JsuUINi1M8Q13W2V4KJTIdAIA0oXBBb2hfhtzhR4/b6L8rbdB7RF8gvSxHOsP2tPJrRh4gCW48o6yQh0Ta3BX5RJtcbHiKl0Fw4+U8NOV5AJ5Vjfq9MNyMeOfhqzYTDhnw5FckHmCOSbMcbdHT8CgYBScHFq+B7UKDkp3LSkn3wqLw38nC+0F7bpE9fATG/+tdRdE8bYignX6GeL75uOeBlBSYcRe2SJtM6Inff9eS4jYGadVSsp1cPO/BKcfBb2RKperWzExOAwa+NQYCuOpNljwd09XaOR5gVbYX5xnRjOBo/m1CCOnNwaBCmTYngnmQKBgEN68ecF1lvyo6UL5FKgLCYUMqlyNjERqv5/h2pnp/+EHQhDppSwXwMdDhKghYn5Yzqaripezzr2bMq0xoNCGKPQ1AxqDk94apUSnDwc2rH9ixsuoxHrWVOPKEBT8oe80rBARPffTOhesbWXQAY3qzPiF71aSM+E3KEgURTI+HrNAoGBAIjQm7NmDygRaSavRGLErMdBsFwCLVxQDO9U6IFrP/CJxjatD2EWU5/S6uphRMi5Bapdc1kJEuwht7gzwVfldhuDG76GXhYIkJpcu7jECcGxIioyQbDs5GGNmYRWC4xlKRnq9lPNl3hFOhf1YeBS5FRBNogd5z6VULNKj2cXxWbz

3. The string to be signed is:123456789

4. The result of calculating the signature using SHA256WithRSA is:F1kKldW4u0xdSzMqehHLtrX6ntK6gjlZ1Nu1IwcCYAvGe+K9/+9VZymbyNjw038ZcxGspnDqcz7+UnqqJ8gBPpMZ4yZb/NdS5TNqruuSooj2jgPk/PlM+uFH97NlMDuUdGVaflujhcaG9irkq48PHQ1+swaELq7mKov7NU155k7bRPWjNzIggxF5Sgh3qcOBpeWVxp/WghRsjfO4O0tRohiOK5pdcAPkj5VlunUgW0/Yv/uC9sV8dodLloUNWG6W0c/pEJnsG48pLLmhag5tzKm7nbHHUrRyLv37+qAuG9S5eZvKUaVbuFwxP2ekSLHRRIQVlBeJbuqfHRQXxzZaJw==

5. My public key is:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAifTfGE5tMBLgcnuc0omSp3DSIOlgb0x44OHWHPQR9M0fi3h3f41aPiJ6zIiBYG5Z3+3mCf8JTxuXEjDEskDB4/+6NKa3PlWbKotZo1/PCJyuKg5eqhQRa4OHUawgMCCy1Tj/6aVFN7KLjJp2J7zklMriwZ4Up6PKk6RUm3BQJD2h0ZlJnE7VT1rjTWz2mVZTZ/NYpiCFcPCyszsws/QjTXIpJL21JWaf3GdBZd7OonKjgo0b2poPCi2SbPQ+dkttF+tMp63hCJ/IOpa++28jhggkcKXTJfQpfPVpmwtwN0SoexkT7Y8sdweWkKhN7CubDU/B/PxKnJ0HvEKFQbO8dQIDAQAB

6. Signature Verification Result:true

4. 生成した署名をHTTPリクエストの本体パラメータsignに追加

レスポンスおよび非同期通知の処理

  1. ゲートウェイプラットフォームの公開鍵を取得し、gatewayRsaPublicKeyとして指定して、署名の検証に使用します。
  2. 検証する内容(content_to_be_Valided)を構築し、ゲートウェイAPIに署名する際に構築した署名対象の文字列と同様にします。ここでは繰り返しません。
  3. レスポンスメッセージの本文または非同期通知で受信したメッセージ本文から署名を抽出します。パラメータのキーワードはsignです。
  4. 使用している開発言語のネイティブ関数を使用して署名を検証します。
sha256withrsa_verify(base64UrlDecode(<sign>), <Content_To_Be_Validated>, <gatewayRsaPublicKey>)};

サンプルコード

以下はJava SDKを使用したサンプルコードで、RSAによる署名認証の方法を示しています。完全なコードについては、Java SDKを参照してください:

rsa auth java サンプル

Basic Auth

**Basic Authentication(ベーシック認証)**は、HTTPプロトコルで一般的に使用されるシンプルな認証方式です。この方式では、クライアントがリクエストヘッダーにユーザー名とパスワードを提供し、サーバーはそれに基づいて認証を行います。

動作原理

  1. クライアントは、特定のフォーマットでユーザー名とパスワードをHTTPリクエストでサーバーに渡します。フォーマットは以下の通りです:
Authorization: Basic <Base64エンコードされたユーザー名:パスワード>

<Base64エンコードされたユーザー名:パスワード>これは、ユーザー名とパスワードをコロンで区切った後、それをBase64エンコードした結果です。例えば、ユーザー名が「user」、パスワードが「password」の場合、「user:password」の組み合わせはBase64エンコードされて「dXNlcjpwYXNzd29yZA==」となり、リクエストヘッダーは次のようになります:

Authorization: Basic dXNlcjpwYXNzd29yZA==
  1. サーバーがリクエストを受信すると、Authorizationヘッダーを解析し、ユーザー名とパスワードをデコードします。次に、サーバーはこれらの情報が有効かどうかを確認し、検証が通ればリソースへのアクセスを許可します。検証に失敗した場合、エラーが返されます。

サンプルコード

以下は、Java SDKを使用してBasic Authenticationを行う方法を示すサンプルコードです。完全なコードについては、Java SDK を参照してください。

basic auth java サンプル