S3やSESで古い署名バージョンのサポート廃止に伴いAWS SDK for Javaが使用する署名バージョン事情を確認した。
署名バージョン
署名の形式にはバージョン1から4までの4種類があり現在では主にバージョン4が利用されている。
一部のリージョン、サービスでは古い署名形式であるバージョン2、バージョン3が引き続きサポートされている。
署名v4
現在主流の署名形式。
全てのリージョンとAmazon SimpleDBを除く全てのサービスで署名v4がサポートされている。
署名手順の詳細は『署名バージョン 4 を使用してAWS リクエストに署名する』を参照。
署名v3
ドキュメントにあまり名前が出てこない影の薄い署名バージョン。
Route53 と SES で利用される。
署名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