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

:リクエストの署名

最終更新日:Nov 10, 2025

セキュリティを確保するために、すべてのHTTPおよびHTTPS APIリクエストに署名する必要があります。 Alibaba Cloudは、リクエスト署名に基づいてリクエスト送信者のIDを検証します。 Alibaba Cloudは、AccessKeyペアを使用して対称暗号化を実行し、リクエスト送信者のIDを検証します。

説明
  • AccessKeyペアは、API操作を呼び出すために使用されるログイン資格情報として機能し、ユーザー名とパスワードはApsara File Storage NASコンソールへのログインに使用されます。 AccessKey IDはユーザーのIDの検証に使用され、AccessKey secretは署名文字列の暗号化と検証に使用されます。 AccessKeyは秘密にしておく必要があります。 詳細については、「AccessKeyペアの取得」をご参照ください。

  • NASは複数のプログラミング言語でSDKを提供し、サードパーティのSDKをサポートします。 SDKを使用すると、より効率的にリクエストに署名できます。 詳細については、「SDKの概要」をご参照ください。

ステップ1: 正規化されたクエリ文字列を作成する

  1. リクエストパラメーターをアルファベット順に並べ替えます。 リクエストパラメーターをアルファベット順に並べ替えます。 リクエストパラメーターには、共通リクエストパラメーターと、Signature以外の操作固有パラメーターが含まれます。

    説明

    GETメソッドを使用してリクエストを送信する場合、疑問符 (?) の後に続き、リクエストURIのアンパサンド (&) で接続されているパラメーターはリクエストパラメーターです。

  2. 正規化されたクエリ文字列を UTF-8でエンコードします。 RFC 3986に従って、次のルールに基づいてパラメーターとその値をエンコードします。

    • 大文字、小文字、数字、ハイフン (-) 、アンダースコア (_) 、およびピリオド (.) は、エンコードする必要はありません。

    • その他の文字は、% XY形式でパーセントエンコードする必要があります。 XYは文字のASCIIコードを16進表記で表します。 たとえば、二重引用符 (") は % 22にエンコードされます。

    • 拡張UTF-8文字は、% XY % ZA… 形式でエンコードされます。

    • スペース文字は % 20にエンコードする必要があります。 スペース文字をプラス記号 (+) にエンコードしないでください。

    RFC 3986ベースのエンコード方法は、Java標準ライブラリのe java.net.URLEncoderクラスなどのapplication/x-www-form-urlencoded MIMEエンコードアルゴリズムとは異なります。 RFC 3986ベースのエンコード方法を使用する場合は、標準ライブラリに基づいて文字列をエンコードできます。 次に、エンコードされた文字列の各プラス記号 (+) を % 20に置き換え、エンコードされた文字列の各アスタリスク (*) を % 2Aに置き換えます。 これらの手順を完了すると、上記のルールに準拠したエンコードされた文字列が生成されます。 アルゴリズムを実装するには、次のpercentEncodeメソッドを使用できます。

    private static final String ENCODING = "UTF-8";
    
    private static String percentEncode(String value) throws UnsupportedEncodingException {
     return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A") : null;
    }       
  3. 等号 (=) を使用して、エンコードされたパラメーター名と値を接続します。

  4. アンパサンド (&) を使用して、エンコードされたリクエストパラメーターを接続します。 これらのパラメーターは、手順1と同じ順序でソートする必要があります。

上記の手順を完了すると、リクエスト構文に続く正規化されたクエリ文字列 (CanonicalizedQueryString) が生成されます。 詳細については、「リクエスト構文」をご参照ください。

ステップ2: 文字列署名を作成する

  1. 文字列記号 (StringToSign) を作成します。 percentEncodeを使用して、手順1で生成された正規化クエリ文字列をエンコードすることもできます。 文字列署名を作成するときは、次のルールに注意してください。

    StringToSign=
      HTTPMethod + "&" + //HTTPMethod: The HTTP method that is used to send the request, such as GET. 
      percentEncode("/") + "&" + //percentEncode("/"): Encodes backslashes (/) into %2F. 
      percentEncode(CanonicalizedQueryString) // Encodes the canonicalized query string that is generated in Step 1. 
  2. RFC 2104に基づいて、string-to-signのハッシュベースのメッセージ認証コード (HMAC) 値を計算します。 Secure Hash Algorithm 1 (SHA-1) アルゴリズムを使用して、HMAC値を計算します。 この例では、Java Base64エンコード方法が使用されます。

    Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )
    説明

    署名を計算すると、RFC 2104で必要なキー値として、AccessKeyシークレットの後にアンパサンド (&) が使用されます。 キー値のASCII値は38です。 詳細については、「」をご参照ください。AccessKeyペアの取得.

  3. RFC 3986に基づいてSignatureパラメーターをエンコードし、正規化されたクエリ文字列にパラメーターを追加します。

例1: パラメータの連結

この例では、DescribeRegions操作が呼び出されます。 次の例は、AccessKeyIDがtestidに設定され、AccessKeySecretがtestsecretに設定されている場合の署名プロセスを示しています。

  1. 正規化されたクエリ文字列を作成します。

    http://nas.cn-hangzhou.aliyuncs.com/?Timestamp=2021-11-30T09%3A18%3A51Z&Format=JSON&AccessKeyId=testid&Action=DescribeRegions&SignatureMethod=HMAC-SHA1&SignatureNonce=47b920a4f8fb2769d2404b74860e3e5d&Version=2017-06-26&SignatureVersion=1.0
  2. 文字列記号 (StringToSign) を作成します。

    GET&%2F&AccessKeyId%3Dtestid%26Action%3DDescribeRegions%26Format%3DXML%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf%26SignatureVersion%3D1.0%26Timestamp%3D2021-11-11T12%253A46%253A24Z%26Version%3D2017-06-26
  3. 署名値を計算します。 AccessKeySecretがtestsecretに設定されている場合、署名を計算するためのキー値としてtestsecret& が使用されます。 計算された署名はOLeaidS1JvxuMvnyHOwuJ + uX5qY= です。 この例では、Java Base64エンコード方法が使用されます。

    Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(StringToSign) ) )
  4. RFC 3986に基づいてエンコードされたSignature=OLeaidS1JvxuMvnyHOwuJ % 2BuX5qY % 3D文字列を、手順1のURLに追加します。

    http://nas.cn-hangzhou.aliyuncs.com/?SignatureVersion=1.0&Action=DescribeRegions&Format=JSON&SignatureNonce=47b920a4f8fb2769d2404b74860e3e5d&Version=2017-06-26&AccessKeyId=testid&Signature=OLeaidS1JvxuMvnyHOwuJ%2BuX5qY%3D&SignatureMethod=HMAC-SHA1&Timestamp=2021-11-30T12%253A46%253A24Z

新しいURLを使用すると、ブラウザまたはcURLやWgetなどのツールからHTTPリクエストを送信して、Alibaba Cloudリージョンのクエリに使用されるDescribeRegions操作を呼び出すことができます。

例2: プログラミング言語の標準ライブラリを使用する

この例では、DescribeRegions操作が呼び出されます。 次の例は、AccessKeyIDがtestidに設定され、AccessKeySecretがtestsecretに設定され、すべてのリクエストパラメーターがJava Map<String, String> オブジェクトに配置されている場合の署名プロセスを示しています。

  1. エンコード方法を事前定義します。

    private static final String ENCODING = "UTF-8";
    private static String percentEncode(String value) throws UnsupportedEncodingException {
      return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A") : null;
    }
  2. Timestampパラメーターの時間形式を事前定義します。 Timestampパラメーターの値は、ISO 8601標準で指定する必要があります。 時刻は UTC である必要があります。

    private static final String ISO8601_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss'Z'";
    private static String formatIso8601Date(Date date) {
      SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
      df.setTimeZone(new SimpleTimeZone(0, "GMT"));
      return df.format(date);
    }
  3. クエリ文字列を作成します。

    final String HTTP_METHOD = "GET";
    Map<String, String> parameters = new HashMap<>();
    // Configures request parameters.
    parameters.put("Action", "DescribeRegions");
    parameters.put("Version", "2017-06-26");
    parameters.put("AccessKeyId", "testid");
    parameters.put("Timestamp", formatIso8601Date(new Date()));
    parameters.put("SignatureMethod", "HMAC-SHA1");
    parameters.put("SignatureVersion", "1.0");
    parameters.put("SignatureNonce", UUID.randomUUID().toString());
    parameters.put("Format", "JSON");
    // Sorts the request parameters.
    String[] sortedKeys = parameters.keySet().toArray(new String[]{});
    Arrays.sort(sortedKeys);
    final String SEPARATOR = "&";
    // Creates a string-to-sign.
    StringBuilder stringToSign = new StringBuilder();
    stringToSign.append(HTTP_METHOD).append(SEPARATOR);
    stringToSign.append(percentEncode("/")).append(SEPARATOR);
    StringBuilder canonicalizedQueryString = new StringBuilder();
    for(String key : sortedKeys) {
    // Encodes the key and value.
      canonicalizedQueryString.append("&")
      .append(percentEncode(key)).append("=")
      .append(percentEncode(parameters.get(key)));
    }
    // Encodes the canonicalized query string.
    stringToSign.append(percentEncode(
      canonicalizedQueryString.toString().substring(1)));
  4. 署名を計算します。 AccessKeySecretがtestsecretに設定されている場合、署名を計算するためのキー値としてtestsecret& が使用されます。 計算されたシグネチャはOLeaidS1JvxuMvnyHOwuJ % 2BuX5qY % 3Dです。

    // Calculates the signature.
    final String ALGORITHM = "HmacSHA1";
    final String ENCODING = "UTF-8";
    key = "testsecret&";
    Mac mac = Mac.getInstance(ALGORITHM);
    mac.init(new SecretKeySpec(key.getBytes(ENCODING), ALGORITHM));
    byte[] signData = mac.doFinal(stringToSign.toString().getBytes());
    String signature = Base64 .getEncoder().encodeToString(signData);
    // Prints the canonicalized query string.
    String url = parameters.entrySet().stream()
        .map(e -> String.format("%s=%s", e.getKey(), percentEncode(e.getValue())))
        .collect(Collectors.joining("&", "http://nas.cn-hangzhou.aliyuncs.com/?", "&Signature=" + percentEncode(signature)));
    System.out.println("url: " + url);

    RFC 3986に基づいてSignatureパラメーターをエンコードし、結果を正規化されたクエリ文字列に追加します。 次のURLが取得されます。

    http://nas.cn-hangzhou.aliyuncs.com/?AccessKeyId=testid&Action=DescribeRegions&Format=JSON&SignatureMethod=HMAC-SHA1&SignatureNonce=a7568db9-3647-4a3b-9f49-6cd9cd51c28a&SignatureVersion=1.0&Timestamp=2021-11-30T09%3A46%3A11Z&Version=2017-06-26&Signature=7LgzXFA0qiWbH0L2fFk0qbYyGC8%3D
  5. ブラウザまたはcURLやWgetなどのツールを使用してHTTPリクエストを送信します。

    {
    "TotalCount":25,
    "RequestId":"A66FCCB9-4538-193F-A67A-2E0A515A****",
    "PageSize":10,
    "PageNumber":1,
    "Regions":{
    "Region":[
    {
    "RegionId":"cn-hangzhou",
    "RegionEndpoint":"nas.cn-hangzhou.aliyuncs.com",
    "LocalName":"China(Hangzhou)"
    },
    {
    "RegionId":"cn-shanghai",
    "RegionEndpoint":"nas.cn-shanghai.aliyuncs.com",
    "LocalName":"China(Shanghai)"
    }
    ]
    }
    }

応答は、リージョンおよびリージョンIDを含む。 リクエストの送信時にFormatをXMLに設定した場合、レスポンスはJSON形式ではなくXML形式で返されます。 詳細については、「応答」をご参照ください。