七 月
17
金曜日
2020

AWS APIのリクエスト署名v2/v3の廃止について

S3やSESで古い署名バージョンのサポート廃止に伴いAWS SDK for Javaが使用する署名バージョン事情を確認した。


署名バージョン

署名の形式にはバージョン1から4までの4種類があり現在では主にバージョン4が利用されている。
一部のリージョン、サービスでは古い署名形式であるバージョン2、バージョン3が引き続きサポートされている。

署名v4

現在主流の署名形式。
全てのリージョンとAmazon SimpleDBを除く全てのサービスで署名v4がサポートされている。

署名手順の詳細は『署名バージョン 4 を使用してAWS リクエストに署名する』を参照。

署名v3

ドキュメントにあまり名前が出てこない影の薄い署名バージョン。
Route53SES で利用される。

署名v2

v4以前の主流。
署名手順の詳細は『Query リクエストの署名を生成する方法』 を参照。

『サポートされているリージョンおよびサービス』 によるとv2が利用できるリージョンとサービスは以下の通り。

リージョン

  • 米国東部 (バージニア北部) リージョン
  • 米国西部 (北カリフォルニア) リージョン
  • 米国西部 (オレゴン) リージョン
  • 欧州 (アイルランド) リージョン
  • アジアパシフィック (東京) リージョン
  • アジアパシフィック (シンガポール) リージョン
  • アジアパシフィック (シドニー) リージョン
  • 南米 (サンパウロ) リージョン

サービス

  • Amazon EC2 Auto Scaling
  • AWS CloudFormation
  • Amazon CloudWatch
  • AWS Elastic Beanstalk
  • Amazon Elastic Compute Cloud (Amazon EC2)
  • Elastic Load Balancing
  • Amazon EMR
  • Amazon ElastiCache
  • AWS Identity and Access Management (IAM)
  • AWS Import/Export
  • Amazon Relational Database Service (Amazon RDS)
  • Amazon Simple Notification Service (Amazon SNS)
  • Amazon Simple Queue Service (Amazon SQS)
  • Amazon SimpleDB

S3における署名v2のサポートについて

『Amazon S3 アップデート — SigV2 の廃止時期、延期と変更』 によると、

  • 当初S3における署名v2のサポートを2019年6月24日に廃止する予定であったが撤回
  • 既存のバケットについてv2のサポートを継続
  • 2020年6月24日以降に作成したバケットについてはv4のみをサポート

とのこと。

SESにおける古い署名バージョンのサポートについて

『Amazon SES API へのリクエストの認証』によると、

重要 2020 年 10 月 1 日以降、Amazon SES は署名バージョン 4 を使用して署名されたリクエストのみをサポートします。古いバージョンの AWS 署名を使用する場合は、その日より前に AWS 署名バージョン 4 を導入する必要があります。

とのこと。
SESの古い署名バージョンとはv3のことを指していると思われる。

AWS SDK For Java

『署名バージョン 2 から署名バージョン 4 への移行』によると、署名v4を利用するために必要な最小バージョンのSDKは

  • v1系は1.11.201以降
  • v2系は全般

とある。

1.11.201のCHANGELOGは以下。
CHANGELOG - 1.11.201 2017-09-21

1.11系

ライブラリ内の以下設定ファイルに使用する署名バージョンが定義されている。
awssdk_config_default.json

1.11系はいずれのマイクロバージョンでも全体のデフォルト、S3のデフォルトともにv4となっているためAWSサービスの種類に関係なく常にv4が使用されると考えて良さそうだ。

1.10系

1.10系は以下パスに設定ファイルがある。
awssdk_config_default.json

全体のデフォルト、S3のデフォルトともにv4となっているが serviceRegionSigners によってS3の多くのリージョンではv2を使用する設定となっている。
このためS3へのアクセスはv2になってしまう一方、SES等S3以外のサービスはv4が使用される。

また『リクエスト認証での署名バージョンの指定』 では、

以下コードの追加

System.setProperty(SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY, "true");

もしくは以下起動オプション指定

-Dcom.amazonaws.services.s3.enableV4

で署名v4が有効化になるとあるが、単に上記を指定してもv4にならないケースがあるので注意が必要。
SDKGlobalConfiguration.ENABLE_S3_SIGV4_SYSTEM_PROPERTY のJavaDocには以下のように書かれている。

   /**
     * By default, the AmazonS3Client will continue to use the legacy
     * S3Signer to authenticate requests it makes to S3 in regions that
     * support the older protocol. Setting this property to anything other
     * than null will cause the client to upgrade to Signature Version 4
     * whenever it has been configured with an explicit region (which is a
     * required parameter for Signature Version 4). The client will continue
     * to use the older signature protocol when not configured with a region
     * to avoid breaking existing applications.
     * <p>
     * Signature Version 4 is more secure than the legacy S3Signer, but
     * requires calculating a SHA-256 hash of the entire request body which
     * can be expensive for large upload requests.
     */
    public static final String ENABLE_S3_SIGV4_SYSTEM_PROPERTY =
        "com.amazonaws.services.s3.enableV4";

whenever it has been configured with an explicit region

とあるようにS3クライアントが標準のエンドポイント https://s3.amazonaws.com を使用している場合、v4は有効にならない。
https://s3-ap-northeast-1.amazonaws.com などのリージョン指定のエンドポイントを指定する必要がある。

ソースコードの該当箇所
AmazonS3Client.java#L3208-L3211