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" +
UrlHTTPMethod:大文字の HTTP メソッドです。例:PUT、POST。Content-MD5:リクエストボディの MD5 値で、次のように計算されます。HTTPMethodが `PUT` または `POST` でない場合、MD5 値は空の文字列 (`""`) です。リクエストボディがフォームの場合、MD5 は空の文字列
""です。それ以外の場合は、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` は次のように構成されます。パスを抽出します。パスは URL の
ip:portの後、?の前の部分です。この例では、パスは/test/testSignです。リクエストにクエリまたはフォームパラメーターがない場合、`Url` はパスそのものです。
パラメーターを連結します。クエリパラメーターとフォームパラメーターをキーの辞書式順序で並べ替えます。次に、
Key1=Value1&Key2=Value2&...&KeyN=ValueNのフォーマットで連結します。この例では、結果はa=1&b=2&c=3&d=4となります。説明クエリまたはフォームパラメーターに複数の値がある場合は、最初の
valueのみを使用します。`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」をご参照ください。