APIのデジタル署名
APIのデジタル署名 (Digital Signatures for APIs)
はじめに
EU/UKのセラー(販売者)に適用される規制要件により、特定のAPIについては、開発者がそれぞれのHTTPコールにデジタル署名を追加する必要があります。このドキュメントでは、これらの署名を作成し、HTTPペイロードに追加する方法について規定します。
対象となるAPI
署名は、EUまたはUKに居住するセラーに対してコールが行われる場合に必須となります。また、対象となるのは以下のAPI/メソッドのみです:
- Finances APIのすべてのメソッド
- Fulfillment APIのissueRefund
- Trading APIのGetAccount
-
Post-Order APIの以下のメソッド:
- Issue Inquiry Refund
- Issue case refund
- Issue return refund
- Process Return Request
- Create Cancellation Request
- Approve Cancellation Request
その他のAPIや他の地域のセラーに対しても署名を追加することは可能です。その場合、eBayのシステムは署名を無視しますが、APIコールは通常通り受け入れられ、処理されます。
ペイロード署名の作成
eBayの署名実装は、以下のIETF標準に準拠しています:
- RFC9421
- RFC9530
EU/UKに居住するセラーに代わって呼び出される対象APIの各HTTPペイロードには、以下のHTTPヘッダーが追加されます:
- x-ebay-signature-key: 必須
- Content-Digest: 条件付き
- Signature: 必須
- Signature-Input: 必須
eBayのKey Management APIは、x-ebay-signature-keyおよびSignatureヘッダーの作成に使用される暗号化されたキーペアを生成します。
上記の4つのHTTPヘッダーを作成するために必要な手順は以下の通りです:
1. x-ebay-signature-keyヘッダーの作成
x-ebay-signature-key ヘッダーは常にJWEを含みます。
開発者はKey Management APIを使用して、以下のキーペアを作成します:
- 秘密鍵 (Private Key)
- 公開鍵 (Public Key)
- JWE形式の公開鍵 (Public Key as JWE)
x-ebay-signature-key ヘッダーの値は、Key Management APIによって作成されたJWE形式の公開鍵 (Public Key as JWE)の値となります。
例:
x-ebay-signature-key: eyJ6aXAiOiJERUYiLCJlbmMiOiJBMjU2R0NNIiwidGFnIjoiTjZIc2ItenlIXzZ4blFHQUhOdHByZyIsImFsZyI6IkEyNTZHQ01LVyIsIml2IjoiNjQ1Z0Rzc2lOYUZFb2pOWCJ9.rSWQSIKGgu_gAhLdG87fIpRYyI57KMQKYJpgQoXhPso.jvrOE0g2Q7A8h_Rj.uZsaA0VaVjL9HiciAilnNsos7Da-Fx5W3tr9sZO4qSPD-hB9t-lacy96lyeLiixs0nHXZ21iEwFYkqOllxpqW6eyJPb6lLDrnzg8Nx5AvizLagSDT35_3xBTu6EWf6x-lWBMKiBj8zo31wdjaGWMExcaQSPpwZxbJ3Z1sM4aZmHX7sjjnIT0V9kH1kAj0kD7uGuJ8KlMvrl011z68kJt-ilYG4FZn_Z5.CZzMDhEn1jqL45bYvbO3ig
2. Content-Digestヘッダーの作成
HTTPペイロードが含まれない場合、このヘッダーは不要です。
HTTPペイロードが含まれる場合、このヘッダーはHTTPペイロードに対するSHA-256ダイジェストを提供します。
Content-Digestヘッダーを追加するには、HTTPペイロード(UTF-8文字エンコーディング)に対してSHA-256ダイジェストを計算します。仕様では複数のダイジェスト(例:SHA-256とSHA-512の両方)を追加することが許可されていますが、今回のケースではSHA-256のみが必要です。
Content-Digestヘッダーの追加方法に関する完全な情報については、RFC9530のセクション2「The Content-Digest Field」を参照してください。
Content-Digestヘッダーの追加例を確認するには、RFC9530のセクションB.1「Server Returns Full Representation Data」を参照してください。
以下のペイロードを例とします:
{"hello": "world"}
この場合、Content-Digestヘッダーの値は以下のようになります:
sha-256=:X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=:
3. 署名ベース (Signature base) の作成
署名ベースは、署名の対象となる標準的なHTTPメッセージコンポーネントを含むUS-ASCII文字列です。署名ベースを作成するには、署名者または検証者が、署名の対象コンポーネント(パラメータを含む)の各コンポーネント識別子のエントリを連結します。
署名ベースを作成するための詳細なアルゴリズムを含む完全な情報については、RFC9421のセクション2.5「Creating the Signature Base」を参照してください。
署名ベースの一部となる可能性のある個々の疑似ヘッダー (pseudo headers) の作成に関する追加情報については、RFC9421のセクション2.2「Derived Components」を参照してください。
4. Signatureヘッダーの作成
Signature ヘッダーは、Key Management APIによって生成された秘密鍵 (Private Key)の値(x-ebay-signature-keyヘッダー用)と、署名ベースを使用して作成されます。
Signatureヘッダーの値は、RFC9421のセクション3.1「Creating a Signature」に記載されているとおりに作成されます。
使用する暗号スイートに応じて、以下のRFC9421の該当セクションを参照してください:
- RSASSA-PKCS1-v1_5 using SHA-256
- EdDSA using curve edwards25519
署名ヘッダーの作成例を確認するには、RFC9421の付録B「Example Keys」を参照してください。
5. Signature-Inputヘッダーの作成方法
このヘッダーは、どのヘッダーおよび疑似ヘッダーが含まれているか、また署名を計算する際にそれらがどのような順序で使用されるかを示します。
Signature-Inputヘッダーの作成に関する完全な情報については、RFC9421のセクション4「Including a Message Signature in a Message」を参照してください。
Signature-Inputヘッダーの値は以下のようになります:
sig1=("content-digest" "x-ebay-signature-key" "@method" "@path" "@authority");created=1658440308
HTTPペイロードが含まれない場合、ヘッダーは以下のようになります:
sig1=("x-ebay-signature-key" "@method" "@path" "@authority");created=1658440308
署名のテスト方法
Sandbox環境を使用して、署名メカニズムをテストできます。SandboxでKey Management APIを呼び出し、秘密鍵 (Private Key)、公開鍵 (Public Key)、およびJWE形式の公開鍵 (Public Key as JWE)を作成して、Sandboxでの署名テストを行います。
Sandboxユーザーの作成に関する追加情報については、「Create a test Sandbox user」ドキュメントを参照してください。
エラーコード
本番環境 (Production) またはSandbox環境で対象APIへのコールを発行した際に、リクエストの形式が不適切であるか、必要なヘッダーが含まれていない場合、エラーが返されます。これらのエラーに関する情報は、以下の表を参照してください。
| コード | 意味 |
|---|---|
| 215000 | content-digestヘッダーがありません |
| 215001 | x-ebay-signature-keyヘッダーがありません |
| 215002 | マスターキー取得時の内部エラー |
| 215003 | デジタル署名検証時の内部エラー |
| 215101 | コンテンツダイジェストがありません |
| 215102 | ペイロードがありません |
| 215103 | shaの値の解析に失敗しました |
| 215104 | shaのBase64デコードに失敗しました |
| 215105 | sha-256のコンテンツダイジェストが正しくありません |
| 215106 | sha-512のコンテンツダイジェストが正しくありません |
| 215107 | shaのコンテンツダイジェストが正しくありません |
| 215108 | コンテンツダイジェストの検証に失敗しました |
| 215109 | パラメータが不足しています(内部エラー) |
| 215110 | content-digestヘッダーがありません |
| 215111 | signatureヘッダーがありません |
| 215112 | signature-inputヘッダーがありません |
| 215113 | 署名パラメータ内のタイムスタンプが無効です |
| 215114 | 署名パラメータの作成時間が正しい範囲内にありません |
| 215115 | JWEの復号に失敗しました |
| 215116 | JWEの形式が正しくありません |
| 215117 | 署名内のappidがトークン内のappと一致しません |
| 215118 | JWE内にpkeyがありません |
| 215119 | 公開鍵のデコードに失敗しました |
| 215120 | 署名の検証に失敗しました |
| 215121 | 署名の検証に失敗しました |
| 215122 | 署名の検証に失敗しました |
デジタル署名SDK
デジタル署名ヘッダーの生成プロセスを簡素化するために、eBayは以下のSDKを開発しました。これらのSDKは、デジタル署名ヘッダーを検証するメソッドも提供します。
- Digital Signature SDK (Java)
- Digital Signature SDK (Node.js)
- Digital Signature SDK (PHP)
各SDKに関する追加情報は、それぞれのREADMEファイルで確認できます。
よくある質問 (FAQ)
このセクションのFAQでは、サードパーティアプリケーション、APIセキュリティ、およびAPIのデジタル署名に関する一般的な質問にお答えします。
-
私のアプリケーションからeBay APIを呼び出せません。助けてもらえますか?
開発者アカウントからeBay Developer Supportにお問い合わせください。
-
私はeBay APIを使用する独自のアプリケーションを開発したセラーです。APIコールが失敗し、返金/キャンセル/返品の承認などの実行がブロックされています。どうすればよいですか?
APIが 403 レスポンスコードとともに失敗し、デジタル署名が必要である旨のメッセージが表示される場合は、このドキュメントの「デジタル署名」セクションを参照して、完全な情報を確認してください。
-
デジタル署名を追加しない限り、返金処理がブロックされます。これを回避することはできますか?
いいえ、それは不可能です。返金のためのAPIコールには、デジタル署名を渡すことでセキュリティレイヤーを追加する必要があります。
-
APIコールでデジタル署名を渡していますが、まだ返金を実行できません。次のステップは何ですか?
「デジタル署名」セクションに記載されているすべての手順を完了していることを確認してください。それでも返金APIが失敗し続ける場合は、開発者アカウントからeBay Developer Supportでチケットを開いてください。
-
なぜeBayはこの変更を行ったのですか?
決済サービスの更新を継続する中で、eBayはEUおよびUKのユーザーに対する決済サービスの提供方法を変更しています。その結果、統合(インテグレーション)によってEU/UKのeBayセラーが返金の開始やeBayが処理した支払いに関する特定の情報の提供などの機能を実行できるようにする場合、規制要件を満たすために追加のセキュリティ対策が必要となります。
-
質問への回答が見つかりません。API関連の質問はどこに問い合わせればよいですか?
その他の質問がある場合は、eBay Developer Supportでチケットを開いてください。