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

Object Storage Service:承認ヘッダーにV4署名を含める (推奨)

最終更新日:Jun 12, 2024

Object Storage Service (OSS) では、HTTP Authorizationヘッダーを使用することが、認証情報を提供する最も一般的な方法です。 クエリパラメーターを使用して署名されたPOSTリクエストとリクエストを除き、すべてのOSS操作で認証にAuthorizationヘッダーが使用されます。 このトピックでは、AuthorizationヘッダーにV4署名を含める方法について説明します。

OSS SDKを使用したリクエストの自動署名

OSS SDKはV4シグネチャの自動実装をサポートしています。 OSS SDKを使用してリクエストを開始すると、手動署名が不要になります。 次の表に、さまざまなプログラミング言語の初期化コードサンプルとV4署名の実装を示します。

SDK

クライアントの初期化

署名の実装

Java

初期化

OSSV4Signer.java

PHP

初期化

SignerV4.php

Node.js

初期化

client.js

Browser.js

初期化

Python

初期化

auth.py

Go

初期化

v4.go

C++

初期化

SignerV4.cc

C

初期化

oss_auth.c

Authorizationヘッダーの計算

シナリオによっては、署名を手動で計算する必要がある場合があります。 たとえば、APIリクエストを開始するときは、Authorizationヘッダー値を計算する必要があります。 Authorizationヘッダーの値を計算するときは、Authorizationヘッダーの署名アルゴリズムのバージョンと署名情報をスペースで区切ります。 次の表に、Authorizationヘッダーのコンポーネントを示します。

コンポーネント

説明

署名アルゴリズム

署名の計算に使用されるアルゴリズム。 有効値: OSS4-HMAC-SHA256

署名情報

署名の計算に使用されるパラメーター。 署名情報は、キーと値のペアの形式である。 キーと値のペアをコンマ (,) で区切り、キーと値を等号 (=) で接続します。 署名情報のキーには、2つの必須フィールド (Credentialsignature) と1つのオプションフィールド (AdditionalHeaders) が含まれます。

  • 資格情報: AccessKey IDとスコープ情報。スラッシュ (/) で区切られています。

  • Signature: 計算された署名。

  • AdditionalHeaders: 署名の計算に使用されるオプションのリクエストヘッダー。 複数のヘッダーを指定する場合は、セミコロン (;) で区切ります。 ヘッダーキーは大文字と小文字を区別しないため、辞書式にソートする必要があります。

  • Format

    権限付与: "OSS4-HMAC-SHA256 Credential=" + AccessKeyId + "/" + SignDate + "/" + SignRegion + "/oss/aliyun_v4_request, " + [ "AdditionalHeaders=" + AdditionalHeadersVal + ", " ] + "Signature=" + SignatureVal
  • 例:

    権限付与: OSS4-HMAC-SHA256資格=AKIDEXAMPLE/20231203/cn-hangzhou/oss/aliyun_v4_request, AdditionalHeaders=host;userdefine, Signature=4b663e424d2db9967401ff6ce1c86f8c83cabd77d9908475239d9110642c6 3fa
説明

Security Token Service (STS) から取得した一時的なアクセス資格情報を使用してリクエストを送信する場合、x-oss-security-token:security-tokenヘッダーを指定して、セキュリティトークンをリクエストヘッダーに追加する必要があります。 セキュリティトークンの取得方法の詳細については、「AssumeRole」をご参照ください。

署名計算プロセス

署名の計算は3ステップのプロセスです。

  • ステップ1: HTTPメソッドなど、必要なリクエスト要素に基づいて正規リクエストを作成します。

  • ステップ2: 正規リクエストのハッシュを作成し、正規リクエストのハッシュとOSS4-HMAC-SHA256などの必要な要素を連結して、署名する文字列を作成します。

  • ステップ3: HMAC-SHA256を使用して署名キーを作成し、HMAC-SHA256を使用して、ステップ2で作成した署名キーと署名する文字列に基づいて署名を計算します。

各ステップで必要な要素の詳細については、次のフローチャートを参照してください。 署名の計算例については、「署名の計算例」をご参照ください。

image

ステップ1: 正規リクエストを作成する

必要な要素を、OSSが署名の計算に使用する標準的な要求形式で連結します。

Canonicalリクエスト形式

HTTP動詞 + "\n" +
正規URI + "\n" +
正規クエリ文字列 + "\n" +
Canonicalヘッダー + "\n" +
追加ヘッダー + "\n" +
ハッシュペイロード 

次の表に、上記のパラメーターを示します。

パラメーター

データ型

必須

説明

HTTP動詞

列挙

PUT

HTTPメソッド。PUT、GET、POST、HEAD、DELETE、またはOPTIONSを使用できます。

正規URI

String

必須

/examplebucket/exampleobject

URIエンコードされた文字列。 絶対パスでスラッシュ (/) をエンコードしないでください。

  • URIは、クエリ文字列パラメーターが含まれていない場合、文字列の最後までドメイン名に続くスラッシュ (/) で始まります。

  • URIは、ドメイン名に続くスラッシュ (/) で始まり、クエリ文字列パラメーターが含まれている場合は疑問符 (?) で終わります。

次の項目では、リクエストURIに含まれるリソースに基づいて正規URIを指定する方法について説明します。

  • リクエストURIにバケット名とオブジェクト名の両方が含まれている場合、正規URIは次の形式になります。

    /examplebucket/exampleobjectを使用します。

  • リクエストURIにバケット名のみが含まれる場合、正規URIの形式は /examplebucket/ です。

  • リクエストURIにオブジェクト名のみが含まれている場合は、正規URIを /に設定します。

正規クエリ文字列Canonical Query String

String

必須

UriEncode("marker") "=" UriEncode("someMarker") "&" UriEncode("max-keys") "=" UriEncode("20") "&" UriEncode("prefix") "=" UriEncode("somePrefix")

URIエンコードされたクエリ文字列パラメーター。 各キーと値を個別にURIエンコードする必要があります。

  • 正規クエリ文字列のパラメーターをキー名でアルファベット順に並べ替える必要があります。 ソートはエンコード後に行われます。 複数のパラメーターに同じキーがある場合は、パラメーターを元の順序で配置し、個々のパラメーターをアンパサンド (&) で区切ります。

  • キーに値がない場合は、キーのみを追加します。

  • リクエストにクエリ文字列が含まれていない場合は、正規クエリ文字列を空の文字列 ("") に設定します。 最後に改行を追加する必要があります。

Canonicalヘッダー

String

必須

hos t:cname.com
x-oss-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
x-oss-date:20231203T12121 2Z 

値を持つリクエストヘッダーのリスト。

  • ヘッダーのキーと値はコロン (:) で区切り、ヘッダーは改行で区切ります。

  • ヘッダーキーは小文字で、アルファベット順に並べ替える必要があります。 ヘッダー値の先頭または末尾のスペースをトリミングする必要があります。

  • ヘッダーキーはアルファベット順にソートされます。

  • x-oss-dateヘッダーの値は、ISO 8601標準 (例: 20231203T121212Z) である必要があります。

Canonicalヘッダーは2つのタイプに分けられます。

  • 存在する必要があり、署名計算に使用されるヘッダー:

    • x-oss-content-sha256 (値はUNSIGNED-PAYLOAD)

    • 追加ヘッダーで指定され、署名の計算に使用されるヘッダー:

  • リクエストに含まれている場合にCanonicalヘッダーに追加する必要があるヘッダー:

    • Content-Type

    • Content-MD5

    • x-oss-*

追加ヘッダー

String

必須

content-length; ホスト

署名を計算するために追加するヘッダー (Content-Type、Content-MD5、およびx-oss-* ヘッダーを除く) 。 すべてのヘッダーキーは小文字で、アルファベット順に並べ替える必要があります。

ハッシュペイロード

String

必須

UNSIGNED-PAYLOAD

有効値: UNSIGNED-PAYLOAD

"GET" | "PUT" |... + "\n" +
UriEncode(<リソース>) + "\n" +
UriEncode(<QueryParam1>) + "=" + UriEncode(<Value>) + "&" + UriEncode(<QueryParam2>) + "\n" +
小文字 (<HeaderName1>) + ":" + Trim(<value>) + "\n" + 小文字 (<HeaderName2>) + ":" + Trim(<value>) + "\n" +
小文字 (<AdditionalHeaderName1>) + ";" 小文字 (<AdditionalHeaderName2>) + "\n" +
未承認-ペイロード 

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

正規リクエストのハッシュを作成し、ハッシュと他の要素を連結して、署名する文字列を作成します。

  • Format

    "OSS4-HMAC-SHA256" + "\n" +
    タイムスタンプ + "\n" +
    スコープ + "\n" +
    Hex(SHA256Hash(<CanonicalRequest>)) 

    次の表に、上記のパラメーターを示します。

    パラメーター

    データ型

    必須

    説明

    OSS4-HMAC-SHA256

    列挙

    OSS4-HMAC-SHA25

    正規リクエストのハッシュを作成するために使用されるアルゴリズム。 有効値: OSS4-HMAC-SHA256

    タイムスタンプ

    String

    必須

    20231203T1212Z

    UTCでの現在の時刻。 時間は、ISO 8601規格に従わなければならない。

    スコープ

    String

    必須

    20231203/cn-hangzhou/oss/aliyun_v4_request

    スコープ情報。 これにより、結果の署名が指定されたリージョンとサービスに制限されます。 形式:

    <SigningDate>/<SigningRegion>/oss/aliyun_v4_request
    • SigningDate: リクエストが開始された日付。

    • SigningRegion: 要求されたリソースが存在するリージョン。

    • oss: 要求されたサービスの名前。 値をossに設定します。

    • aliyun_v4_request: リクエスト内の署名バージョンの説明。 値をaliyun_v4_requestに設定します。

    CanonicalRequest

    String

    必須

    PUT

    /examplebucket/exampleobject

    content-md5:eB5eJF1ptWaXm4bijSPyxw

    content-type:text/html

    hos t:examplebucket.oss-cn-hangzhou.aliyuncs.com

    x-oss-content-sha256:UNSIGNED-PAYLOAD

    x-oss-date:20231203T121212Z

    x-oss-meta-author:alice

    x-oss-meta-magic:abracadabra

    host

    UNSIGNED-PAYLOAD

    ステップ1で作成した文字列。

  • 例:

    "OSS4-HMAC-SHA256" + "\n" +
    FormatISO8601 + "\n" +
    20231203/cn-hangzhou/oss/aliyun_v4_request + "\n" +
    Hex(SHA256Hash(<CanonicalRequest>)) 

ステップ3: 署名を計算する

署名キーを作成し、署名キーを使用して署名を計算します。

  1. HMAC-SHA256を使用して、次の形式を使用して署名キーを作成します。

    説明

    次のコードでは、SKはAccessKeyペア、DateはISO8601形式 (例: 20231203T1212Z) の現在時刻、regionは要求されたリソースが存在するリージョンです。

    DateKey = HMAC-SHA256("aliyun_v4" + SK、日付);
    DateRegionKey = HMAC-SHA256(DateKey, Region);
    DateRegionServiceKey = HMAC-SHA256(DateRegionKey, "oss");
    SigningKey = HMAC-SHA256(DateRegionServiceKey, "aliyun_v4_request"); 

    前の行を1行にまとめることができます。

    SigningKey = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("aliyun_v4" + SK、日付)) 、リージョン) 、"oss") 、"aliyun_v4_request");
  2. 署名キーと文字列を使用して署名を計算します。

    署名=HEX(HMAC-SHA256(SigningKey, StringToSign))

署名の計算例

この例では、PutObjectリクエストのAuthorizationヘッダーにV4署名を含める方法を示します。

  • パラメーター

    パラメーター

    AccessKeyId

    accesskeyid

    AccessKeySecret

    accesskeysecret

    Timestamp

    20231203T1212Z

    バケット

    examplebucket

    オブジェクト

    exampleobject

    Region

    cn-hangzhou

  • PutObject

    PUT /exampleobject HTTP/1.1
    Content-MD5: eB5eJF1ptWaXm4bijSPyxw
    コンテンツタイプ: text/html
    日付: 12月3日日曜日2023 12:12:12GMT
    ホスト: examplebucket.oss-cn-hangzhou.aliyuncs.com
    権限付与: SignatureToBeCalculated
    x-oss-date: 20231203T121212Z
    x-oss-meta-author: alice
    x-oss-meta-magic: abracadabra
    x-oss-content-sha256: UNSIGNED-PAYLOAD 
  • V4署名をAuthorizationヘッダーに含めるには、次の手順を実行します。

    1. 正規のリクエストを作成します。

      PUT
      /examplebucket/exampleobject
      
      content-md5:eB5eJF1ptWaXm4bijSPyxw
      content-type:text/html
      hos t:examplebucket.oss-cn-hangzhou.aliyuncs.com
      x-oss-content-sha256:UNSIGNED-PAYLOAD
      x-oss-date:20231203T121212Z
      x-oss-meta-author:alice
      x-oss-meta-magic:abracadabra
      
      ホスト
      未承認-ペイロード 
    2. 署名する文字列を作成します。

      OSS4-HMAC-SHA256
      20231203T1212Z
      20231203/cn-hangzhou/oss/aliyun_v4_request
      129b14df88496f434606e999e35dee010ea1cecfd3ddc378e5ed4989609c1db 3 
    3. 署名を計算します。

      1. 署名キーを計算します。

        HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("aliyun_v4" + "accesskeysecret", "20231203T1212Z")), "cn-hangzhou"), "oss"), "aliyun_v4_request");
      2. 署名を計算します。 署名の例:

        4b663e424d2db9967401ff6ce1c86f8c83cabd77d9908475239d9110642c6 3fa
    4. 署名をAuthorizationヘッダーに追加します。

      OSS4-HMAC-SHA256 Credential=accesskeyid/20231203/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=host,Signature=4b663e424d2db9967401ff6ce1c86f8c83cabd77d9908475239d9110642c6 3fa
  • サンプルコード

    impor t org.apache.com mons.codec.digest.DigestUtils;
    
    javax.crypto.Macをインポートします。javax.crypto.spec.SecretKeySpecをインポートします。java.security.InvalidKeyExceptionをインポートします。java.security.NoSuchAlgorithmExceptionをインポートします。/**
     * 署名デモ
     * /
    パブリッククラスDemo1 {
    
        /**
         * 署名の計算
         *
         * @ return承認
         */
        public static void main(String[] args) throws Exception {
            // ステップ1: 正規リクエストを作成します。
            文字列canonicalRequest=
                            "PUT\n" +
                            "/examplebucket/exampleobject\n" +
                            "\n" +
                            「content-md5:eB5eJF1ptWaXm4bijSPyxw\n」 +
                            "content-type:text/html\n" +
                            "hos t:examplebucket.oss-cn-hangzhou.aliyuncs.com\n" +
                            「x-oss-content-sha256:UNSIGNED-PAYLOAD\n」 +
                            "x-oss-date: 20231203T1212Z \n" +
                            "x-oss-meta-author:alice\n" +
                            "x-oss-meta-magic:abracadabra\n" +
                            "additionalHeaderExample1\n" +
                            "UNSIGNED-PAYLOAD";
    
            // ステップ2: 署名する文字列を作成します。
            String stringToSign = "OSS4-HMAC-SHA256\n" +
                    "20231203T1212Z \n" +
                    "20231203/cn-hangzhou/oss/aliyun_v4_request\n" +
                    DigestUtils.sha256Hex(canonicalRequest);
    
            // ステップ3: 署名を計算します。
            文字列dateKey = hmacsha256("aliyun_v4" + "accesskeysecret", "20231203T1212Z");
            文字列dateRegionKey = hmacsha256(dateKey、"cn-hangzhou");
            文字列dateRegionServiceKey = hmacsha256(dateRegionKey、"oss");
            String signingKey = hmacsha256(dateRegionServiceKey, "aliyun_v4_request");
    
            String signature = hmacsha256(signingKey, stringToSign);
    
            System.out.println("Signature:" + signature);
            
            文字列認証="OSS4-HMAC-SHA256" +
                    "Credential=accesskeyid/20231203/cn-hangzhou/oss/aliyun_v4_request", +
                    "AdditionalHeaders=ホスト", +
                    "Signature=" + signature;
            
            System.out.println("Authorization:" + authorization);
        }
    
        public static String hmacsha256(String data, String secret) {
            try {
                // 指定されたキーを使用してHMAC-SHA256キーを作成する
                SecretKeySpec secretKeySpec=新しいSecretKeySpec(secret.getBytes() 、"HmacSHA256");
    
                // Macオブジェクトを作成する
                Mac mac = Mac.getInstance("HmacSHA256");
                mac.init(secretKeySpec);
    
                // HMAC操作を実行します。
                byte[] hmacBytes = mac.doFinal(data.getBytes());
    
                // 結果を16進文字列に変換します。
                StringBuilder sb=新しいStringBuilder(hmacBytes.length * 2);
                for (バイトb : hmacBytes) {
                    sb.append(String.format("% 02x", b));
                }
                戻り値sb.toString();
            } catch (NoSuchAlgorithmException | InvalidKeyException e) {
                新しいRuntimeExceptionを投げる ("HMAC-SHA256の計算に失敗しました" 、e);
            }
        }
    }