Amazon Web Services ブログ
ポスト量子 TLS を Python で実装・検証する方法
本ブログは 2025 年 7 月 24 日に公開された AWS Blog “Post-quantum TLS in Python” を翻訳したものです。
Amazon Web Services (AWS) では、セキュリティが最優先事項です。データの機密性を維持することは、AWS とお客様の運用環境セキュリティにおいて重要な要素です。まだ実現していませんが、暗号解読能力を持つ量子コンピュータ (CRQC: cryptographically relevant quantum computer) が登場すれば、現在使用されている公開鍵アルゴリズムを破り、データの機密性を脅かす可能性があります。こうした脅威に備えるため、米国国立標準技術研究所 (NIST) は 2016 年にCRQC に耐性のある新しい暗号アルゴリズムの標準化に取りかかりました。2024年8月、暗号コミュニティによる8年間の厳密な審査を経て、NIST は従来の公開鍵アルゴリズムを補完し、最終的に置き換えるための3つのポスト量子暗号 (PQC) 標準を選定しました。その中には FIPS 203 の ML-KEM が含まれています。
最近のいくつかの AWS Blog 記事では、AWS における PQC、特に ML-KEM を使用したポスト量子 TLS について説明しています。
この記事では、Python アプリケーションでポスト量子 TLS をテストする方法を紹介します。
Python でのポスト量子 TLS のテスト
別の記事で詳しく説明されているように、AWS は現在、データの機密性に対する多層防御を提供するため、従来の鍵交換と ML-KEM を併用するハイブリッド構成でポスト量子 TLS を提供しています。ML-KEM は従来の方式よりもはるかに大きな鍵を使用するため、ハイブリッド TLS ハンドシェイクでは接続確立時により多くのデータを送受信します。他のプロトコル更新と同様に、セキュリティアプライアンスやネットワークデバイスがこれらの接続を適切に処理できることを検証するために、ネットワークでハイブリッド TLS をテストすることが重要です。このようなテストに、AWS が提供するサンプルをぜひご活用ください。
ハイブリッド TLS をネゴシエートするには、接続の両端 (クライアントとサーバー) にポスト量子対応ソフトウェアが必要です。AWS は現在、サーバー側でハイブリッド TLS の導入を進めています。クライアント側では、ハイブリッド TLS を有効にする方法はSDK の言語ごとに若干異なります。
AWS SDK for Python (Boto3) は、TLS に Python インタープリターの ssl モジュールを使用しており、このモジュールはオペレーティングシステムの暗号ライブラリを使用します。ほとんどの Linux ディストリビューションでは、これは OpenSSL です。OpenSSL は最近、ハイブリッド TLS のサポートを発表し、バージョン 3.5 ではデフォルトで有効になっています。ただし、OpenSSL 3.5 はまだほとんどのオペレーティングシステムディストリビューションでデフォルトになっていません。
テストを可能にするため、標準の Python ディストリビューションと一緒に OpenSSL 3.5 をインストールする Dockerfile を提供しています。これにより、Python アプリケーションでポスト量子ハイブリッド TLS 接続を実行できます。この Dockerfile には、boto3 や requests などの一般的なパッケージもインストールされています。AWS サービス (boto3 と AWS コマンドラインインターフェイス (AWS CLI) を使用)、任意の HTTPS エンドポイント (requests を使用)、TLS で保護された TCP サーバー (Python の標準ライブラリ ssl モジュールを使用) との基本的なやり取りを行うサンプル Python コードを提供しています。
以下のセクションでは、この Dockerfile を使用して Python アプリケーションから AWS サービスへのポスト量子 TLS 接続をテストする方法を説明します。
コンテナのビルド
このコンテナはローカルマシンでビルドすることも、Amazon Elastic Compute Cloud (Amazon EC2) や AWS CloudShell などのクラウド環境でビルドすることもできます。なお、お使いのマシンと AWS 間のネットワークパスを検証したい場合は、コンテナをローカルでビルドして実行する必要があります。コンテナをビルドするための唯一の前提条件は、Docker (または同等のコンテナツール) がインストールされていることです。簡単にするため、以下の手順では主に Linux CloudShell 環境でこれらのコマンドを実行することを想定しています。
- サンプルリポジトリをクローンします。
git clone https://github.com/aws-samples/sample-post-quantum-tls-python - サンプルのディレクトリに移動し、以下のコマンドを実行してコンテナをビルドします。
cd sample-post-quantum-tls-python && docker build . -t pq-tls-python
コンテナの実行
前述のサンプルを実行するには、以下のコマンドを実行します。
上記のコマンドは、AWS Secrets Manager の ListSecrets API を呼び出す権限を持つ AWS CLI のデフォルトプロファイルが設定されていることを前提としています。この権限があれば、Secrets Manager のポスト量子対応 API エンドポイントに対して、機密情報やシークレット値を返さない基本的な読み取り専用のテスト呼び出しを行うことができます。CloudShell では、aws configure でアクセスキーとシークレットキーの値を設定する必要があります。Amazon EC2 では、インスタンスプロファイルを設定して、アクセスキーとシークレットキーの環境変数を不要にできます。
Python が使用する暗号ライブラリの名前とバージョンを出力した後、test.sh は以下の順序でハイブリッド TLS 接続をテストします。
- Python の
socketモジュールとsslモジュールを使用した TCP ソケット通信 requestsライブラリを使用した HTTP リクエストの実行boto3と AWS CLI を使用した AWS API リクエストの実行
テストが成功すると、以下の出力が表示されます。
必要に応じて、tests/ ディレクトリ内のサンプルを確認、変更、拡張できます。提供されている test.sh スクリプトを実行する代わりに、以下のコマンドで対話型シェルにアクセスできます。
docker run --rm -it pq-tls-python
テスト用にファイルを追加または変更した場合は、必ずコンテナを再ビルドしてください。
ポスト量子 TLS ネゴシエーションの確認
ポスト量子ハイブリッド TLS がネゴシエートされたことを確認するには、サンプルの TLS ハンドシェイクを検査して、ポスト量子ハイブリッド TLS 鍵交換が実行されたことを確認します。これを行うには、ホストのネットワークトラフィックをキャプチャする必要があります。CloudShell では、以下のコマンドを使用してキャプチャできます。
sudo tcpdump -A -i docker0 -w pq_tls.pcap
このコマンドにより、Docker のネットワークインターフェイス docker0 上のトラフィックがキャプチャされます。コンテナをローカルで実行している場合は、Linux の docker0 や MacOS の en0 などのローカルネットワークインターフェイスで Wireshark の GUI を使用してパケットキャプチャを実行することもできます。
次に、別のターミナルで「コンテナの実行」セクションの Docker run コマンドを使用してテストスイートを実行します。前述と同様に、ターミナルに成功メッセージが表示され、tcpdump を使用している場合は pq_tls.pcap という名前の新しいファイルが作成されます。このファイルを CloudShell からダウンロードして、ローカルの Wireshark で表示できます。具体的には、クライアントまたはサーバーの Hello ハンドシェイクメッセージ内の key_share 拡張を確認します。Wireshark を使用してパケットキャプチャを表示する場合は、表示フィルター tls.handshake を指定して、ハンドシェイクメッセージのみを表示できます。パケットキャプチャは図 1 のようになります。
図 1: Wireshark でのパケットキャプチャ表示
図 1 では、サーバーの Hello ハンドシェイクメッセージで X25519MLKEM768 が選択されており、ポスト量子ハイブリッド TLS が正常にネゴシエートされたことがわかります。
まとめ
この記事では、Dockerfile を使用して Python でポスト量子ハイブリッド TLS をテストする方法を紹介しました。この AWS サンプルを使用すると、以下の通信でポスト量子ハイブリッド TLS 接続をテストできます。
boto3または AWS CLI を使用した AWS API リクエストrequestsを使用した一般的な HTTPS リクエスト- Python の
socketモジュールとsslモジュールを使用した TLS で保護された TCP ソケット通信
今後のポスト量子ハイブリッド TLS 移行に備えて、この AWS サンプルを使用してネットワークと Python アプリケーションの検証を開始することをお勧めします。AWS はお客様の移行をサポートすることに尽力しており、ポスト量子ハイブリッド TLS も例外ではありません。
この記事についてご質問がある場合は、AWS サポートにお問い合わせください。