すべてのプロダクト
Search
ドキュメントセンター

Mobile Platform as a Service:バックエンド署名検証

最終更新日:Jan 29, 2026

Mobile Gateway Service は、サーバー側の HTTP 署名検証機能を提供し、ゲートウェイとバックエンドサーバー間のトラフィックのセキュリティを確保します。

  • ゲートウェイコンソールで API グループの署名検証を有効にすると、Mobile Gateway Service はそのグループ内の各 API リクエストに署名します。署名に使用する公開鍵と秘密鍵は、ゲートウェイコンソールで作成できます。

  • バックエンドサーバーは署名文字列を読み取り、受信したリクエストに対してローカルで署名計算を実行します。その後、計算された署名と受信した署名を比較して、リクエストが有効かどうかを判断します。

署名の読み取り

Mobile Gateway Service によって計算された署名は、リクエストヘッダーに格納されます。ヘッダーキーは X-Mgs-Proxy-Signature です。

シークレットキー識別子は API グループで設定され、対応するシークレット値を見つけるために使用されます。この識別子は、キー X-Mgs-Proxy-Signature-Secret-Key の下でリクエストヘッダーに送信されます。

署名検証メソッド

組織署名追加用のデータ

String stringToSign =
HTTPMethod + "\n" +
Content-MD5 + "\n" +
Url
  • HTTPMethod:大文字の HTTP メソッドです。例:PUTPOST

  • Content-MD5:リクエストボディの MD5 値で、次のように計算されます。

    1. HTTPMethod が `PUT` または `POST` でない場合、MD5 値は空の文字列 (`""`) です。

    2. リクエストボディがフォームの場合、MD5 は空の文字列 "" です。それ以外の場合は、3 番目の手順を実行します。

    3. MD5 値を計算します。リクエストにボディがない場合、bodyStream は文字列 "null" です。

      String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getBytes("UTF-8")));
      重要

      Content-MD5 の値が空の文字列 (`""`) であっても、署名対象文字列内の後続の改行 (`\n`) は含める必要があります。これにより、文字列内に 2 つの連続した `\n` 文字が含まれることになります。

  • Url:`Url` は、パス、クエリ、およびボディ内のフォームパラメーターから構成されます。たとえば、リクエストが http://ip:port/test/testSign?c=3&a=1 で、フォームパラメーターが b=2&d=4 であるとします。`Url` は次のように構成されます。

    1. パスを抽出します。パスは URL の ip:port の後、? の前の部分です。この例では、パスは /test/testSign です。

    2. リクエストにクエリまたはフォームパラメーターがない場合、`Url` はパスそのものです。

    3. パラメーターを連結します。クエリパラメーターとフォームパラメーターをキーの辞書式順序で並べ替えます。次に、Key1=Value1&Key2=Value2&...&KeyN=ValueN のフォーマットで連結します。この例では、結果は a=1&b=2&c=3&d=4 となります。

      説明

      クエリまたはフォームパラメーターに複数の値がある場合は、最初の value のみを使用します。

    4. `Url` を構成します。フォーマットは Path?Key1=Value1&Key2=Value2&...&KeyN=ValueN です。この例では、`Url` は /test/testSign?a=1&b=2&c=3&d=4 です。

署名を検証する

  • MD5 アルゴリズムを使用した署名の検証

      String sign = "xxxxxxx"; // Mobile Gateway Service からの署名
      String salt ="xxx";     // MD5 ソルト
    
      MessageDigest digest = MessageDigest.getInstance("MD5");
      String toSignedContent = stringToSign + salt;
      byte[] content = digest.digest(toSignedContent.getBytes("UTF-8"));
      String computedSign = new String(Hex.encodeHexString(content));
    
      boolean isSignLegal = sign.equals(computedSign) ? true : false;
  • RSA アルゴリズムを使用した署名の検証

      String sign = "xxxxxxx"; // Mobile Gateway Service からの署名
      String publicKey ="xxx"; // Mobile Gateway Service からの RSA 公開鍵
    
      PublicKey pubKey = KeyReader.getPublicKeyFromX509("RSA", new ByteArrayInputStream(publicKey.getBytes()));
      java.security.Signature signature = java.security.Signature.getInstance("SHA1WithRSA");
      signature.initVerify(pubKey);
      signature.update(stringToSign.getBytes("UTF-8"));
    
      boolean isSignLegal = signature.verify(Base64.decodeBase64(sign.getBytes("UTF-8")));

コード例

詳細については、「HttpSignUtil.java」をご参照ください。