[アップデート] CloudFrontの署名付きURLでECDSA鍵を利用できるようになりました!
こんにちは。まるとです。
タイトルにもある通り、CloudFrontの署名付きURLにECDSA鍵を利用できるようになったアップデートが発表されました。
ECDSA鍵を利用することで、RSAよりも署名の検証が高速かつ署名サイズが小さくURLが短くなるメリットがあります。
そこで実際に試してみました。
やってみる
まずはじめにECDSA鍵ペアを生成します。
# 秘密鍵の生成
openssl ecparam -name prime256v1 -genkey -noout -out private_key.pem
# 秘密鍵から公開鍵の生成
openssl ec -in key.pem -pubout -out public_key.pem
続いて、CloudFrontコンソールのサイドバーに「キー管理 > パブリックキー」から「パブリックキーを作成」を選択します。
任意の名前と公開鍵ファイルの内容を貼り付けます。
次に、キーグループを作成し、先ほど登録した公開鍵をグループに追加します。
キーグループを作成したら、ディストリビューションのビヘイビアで「ビューワーのアクセスを制限する」を「Yes」、「信頼された認可タイプ」を「Trusted key groups (recommended)」、「キーグループ」に追加したキーグループを指定します。
これでCloudFront側の準備は完了です。
続いて署名付きURLを生成します。
今回はAWS SDK for JavaScript V3を使用しました。
SDKの中でもcloudfront-signer
を使用するためライブラリをインストールします。
npm install @aws-sdk/cloudfront-signer
コードは以下のような形です。
import { getSignedUrl } from "@aws-sdk/cloudfront-signer";
import { readFileSync } from "fs";
const url = ''; // コンテンツへのURL
const privateKey = readFileSync("", {}) // 秘密鍵ファイルへのパス
const keyPairId = ""; // 公開鍵ID(CloudFrontコンソールで確認可能)
const dateLessThan = ""; // 有効期限(例: 2025-09-10)
const signedUrl = getSignedUrl({
url,
keyPairId,
dateLessThan,
privateKey,
});
console.log(signedUrl);
生成すると以下のような出力を得られます。
https://d2ighqfa2wemmv.cloudfront.net/tako.jpg?Expires=1757548800&Key-Pair-Id=K31Q6LN704XV56&Signature=MEQCIDni~0w2gpX49RJc2cDF9s7p5mIU~uah974hkpRqeZW3AiBBF9W0g6HugB0wF9TYcpmhZymnWD3Zr~uoyRDNcQawjQ__
生成されたURLにアクセスすると、実際にコンテンツを開くことができました。
RSA鍵を利用したURLとの比較
ECDSAはRSAと比較し、同様のセキュリティレベルを短い鍵長で実現可能です。
理論上だと、署名付きURLも短くなるはずなので、実際にRSA鍵でも同様のURLを作ってみました。
# ECDSA (P-256)
https://d2ighqfa2wemmv.cloudfront.net/tako.jpg?Expires=1757548800&Key-Pair-Id=K31Q6LN704XV56&Signature=MEQCIDni~0w2gpX49RJc2cDF9s7p5mIU~uah974hkpRqeZW3AiBBF9W0g6HugB0wF9TYcpmhZymnWD3Zr~uoyRDNcQawjQ__
# RDS (2048ビット)
https://d2ighqfa2wemmv.cloudfront.net/tako.jpg?Expires=1757548800&Key-Pair-Id=K3D86OXOSNY8S8&Signature=PIiMCM7rZ8LKtOWAdvVnEHg9bfCNSwulzk0mGZYHh71WD35XM4K7f7n-cSug3vSW32E2PsoZWs2WInuqyq2ojFX4hiKz2Dj-MOSZsfqMyAf6iCX60QwOjqndhGUbDMhavN8WqKJX5Eyxl880TUsQFcVg3fzXXkFTI5eU4N7hsfn56jCFtYOHCzKG1kMzS0NNLXKMb7mO4wxG4TSEHXSSAUWVva3TQhZBR3qFY8jowzIWXBDvI2QjVp1lgo10TI7yP4CZaTw4J3RnBScBdKbLsH9MjpEMPHthsEopNHpU~Gsgcx22jeTSoNiDbgqzxpB8R1laoEz2zW~XJDLipAnMvQ__
全く違いますね。署名の部分だけをみた時にECDSAは96文字に対し、RSAは344文字でした。
終わりに
ECDSAはRSAに比べ、キーサイズが短く処理効率が良いため、IoT機器や組み込みデバイスなど処理能力に制限がある環境には特に適しているのではないかと思います。
また、キー強度もRSAと比較し強化されているため、新規で署名付きURLを必要とする要件がある場合は、ECDSAを選択するのが良いと思われます。
ただし、古いクライアントなどECDSAに対応していないこともあるため、RSAから移行する場合は段階的に実施していただくことを推奨します。
以上、まるとでした!