Pythonで耐量子暗号(PQC)対応のOpenSSLを使うには? インストール方式別の対応状況まとめ

Pythonで耐量子暗号(PQC)対応のOpenSSLを使うには? インストール方式別の対応状況まとめ

2025.12.22

Pythonは独自にTLS/SSLを実装しておらず、外部のSSLライブラリにその処理を委ねています。

そのため、Pythonで 耐量子暗号(PQC) に対応した通信を行うためには、実行環境に OpenSSL 3.5 以上が用意されていれば、PQC通信が可能です。しかし、Pythonのインストール方法やOS環境によって、どのバージョンのOpenSSLが使われるかは千差万別です。

本記事では、LinuxとmacOSを対象に開発環境ごとの対応状況を整理してみました。

まとめ

インストール方式 SSLライブラリ バージョン PQC対応
macOSデフォルト システムのLibreSSL LibreSSL 2.8.3 非対応
python.orgインストーラー OpenSSLをバンドル OpenSSL 3.0.18 非対応
Homebrew Python Homebrew OpenSSL OpenSSL 3.6.0 対応
uv 静的リンクしたOpenSSL OpenSSL 3.5.4 対応
Docker公式イメージ システムのOpenSSL OpenSSL 3.5.4(Trixie) 対応
AWS CLIインストーラー OpenSSLとAWS CRTをバンドル OpenSSL 3.0.18 対応(PQCはCRTが担う)

SSL/TLSライブラリの比較

PQC対応状況はライブラリによって異なります。

ライブラリ 開発元 フォーク元 NIST PQC対応 主な採用先
OpenSSL OpenSSL Software Foundation - 3.5以降で対応 主要Linuxディストリビューション
BoringSSL Google OpenSSL 部分的 Chrome, Android, Cloudflare
LibreSSL OpenBSD Project OpenSSL (2014年) 未対応 macOS, OpenBSD
aws-lc AWS BoringSSL + OpenSSL 対応 AWS SDK (CRT), Amazon Linux

暗号ライブラリのPQC対応状況のサーベイが arXivに公開されています。

[2508.16078] A Survey of Post-Quantum Cryptography Support in Cryptographic Libraries

OpenSSL

最も広く使われているSSL/TLSライブラリです。2014年のHeartbleed脆弱性を契機に複数のフォークが生まれています。
2025年4月にリリースされたLTS版の OpenSSL 3.5 からPQCに対応しています。

BoringSSL

GoogleがOpenSSLからフォークした暗号ライブラリです。Chrome/ChromiumやAndroidなどで使用されており、次の2022年のブログのように、PQC対応を積極的に進めてきました。

LibreSSL

OpenBSDプロジェクトが2014年のHeartbleed脆弱性を契機にOpenSSLからフォークしたライブラリです。現時点ではPQCは未実装です。

身近な例としてmacOSがLibreSSLを採用しています。

aws-lc(AWS LibCrypto)

AWSがBoringSSLとOpenSSLをベースに構築したライブラリです。AWS Common Runtime (CRT) の中核コンポーネントとして、AWS CLIなどのAWS SDKで使用されています。

macOSデフォルト (/usr/bin/python3)

macOSにプリインストールされているPythonは、LibreSSLを使用しています。

$ /usr/bin/python3 -c "import ssl,sys; print(sys.version);print(ssl.OPENSSL_VERSION)"
3.9.6 (default, Aug  8 2025, 19:06:38)
[Clang 17.0.0 (clang-1700.3.19.1)]
LibreSSL 2.8.3

Python公式インストーラー

python.orgのMacOS向け公式インストーラー版Pythonは、OpenSSLをバンドルしています。

$ /usr/local/bin/python3 -c "import ssl, sys; print(f'{sys.version}\n{ssl.OPENSSL_VERSION}')"
3.14.2 (v3.14.2:df793163d58, Dec  5 2025, 12:18:06) [Clang 16.0.0 (clang-1600.0.26.6)]
OpenSSL 3.0.18 30 Sep 2025

PQC対応状況

現時点で 3.14 のインストーラーにバンドルされている OpenSSL 3.0.18 はPQCには非対応ですが、OpenSSL 3.5.4 への移行が進行中です。

バンドルの確認方法

$ otool -L /Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_ssl.cpython-314-darwin.so | grep ssl
/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_ssl.cpython-314-darwin.so (architecture x86_64):
        /Library/Frameworks/Python.framework/Versions/3.14/lib/libssl.3.dylib (compatibility version 3.0.0, current version 3.0.0)
/Library/Frameworks/Python.framework/Versions/3.14/lib/python3.14/lib-dynload/_ssl.cpython-314-darwin.so (architecture arm64):
        /Library/Frameworks/Python.framework/Versions/3.14/lib/libssl.3.dylib (compatibility version 3.0.0, current version 3.0.0)

Homebrew Python

Homebrew Pythonは openssl を動的リンクしています。

$ /opt/homebrew/opt/python@3.14/bin/python3.14 -c "import ssl, sys; print(f'{sys.version}\n{ssl.OPENSSL_VERSION}')"
3.14.2 (main, Dec  5 2025, 16:49:16) [Clang 17.0.0 (clang-1700.4.4.1)]
OpenSSL 3.6.0 1 Oct 2025

$ brew deps python@3.14 | grep openssl # 依存関係
openssl@3

OpenSSL について、HomebrewがLTSの3.5ではなく 3.6 をインストールしているのは興味深いです。

uv (python-build-standalone)

Pythonのパッケージ・プロジェクト管理ツールuvは、スタンドアローンなPythonビルド(python-build-standalone)を利用しています。

A new home for python-build-standalone

PQC対応なOpenSSL 3.5.4が利用されており、システムのOpenSSLに依存しません。

$ uv run python3 -c "import ssl, sys; print(f'{sys.version}\n{ssl.OPENSSL_VERSION}')"
3.14.1 (main, Dec  2 2025, 22:17:19) [Clang 21.1.4 ]
OpenSSL 3.5.4 30 Sep 2025

次の実行結果から、静的リンクされていることがわかります。

>>> import _ssl
>>> _ssl.__file__
Traceback (most recent call last):
  File "<python-input-5>", line 1, in <module>
    _ssl.__file__
>>> _ssl.__spec__
ModuleSpec(name='_ssl', loader=<class '_frozen_importlib.BuiltinImporter'>, origin='built-in')

OpenSSL 3.5サポート

Docker (公式Pythonイメージ)

OpenSSL取得元: ベースOSのシステムOpenSSL (動的リンク)

Dockerの公式Pythonイメージは、ベースOSのOpenSSLに動的リンクします。

イメージタグ ベースOS OpenSSL PQC対応
python:3.14-bookworm Debian 12 3.0.17 非対応
python:3.14-trixie Debian 13 3.5.4 対応
python:3.14 Debian 13 3.5.4 対応

特に、 Python 3.14 の場合、デフォルトのディストリビューションが Debian 13 (Trixie) となり、OpenSSL 3.5.4 が利用されます。

言い換えると、Dockerfile で明示的に bookworm タグ等で古いディストリビューションを指定しない限り、PQC対応となります。

FROM python:3.14 # python:3.14-trixie と同じ

WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

CMD ["python", "main.py"]

ディストリビューション別OpenSSLバージョン

$ docker run --rm python:3.14-bookworm python -c "import ssl,sys; print(sys.version, ssl.OPENSSL_VERSION)"
3.14.2 ... OpenSSL 3.0.17 1 Jul 2025

$ docker run --rm python:3.14-trixie python -c "import ssl,sys; print(sys.version, ssl.OPENSSL_VERSION)"
3.14.2 ... OpenSSL 3.5.4 30 Sep 2025

デフォルトディストリビューションの確認方法

python:3.14 のようにディストリビューションを省略した場合、どのOSがデフォルトになるかは docker-library/pythonversions.json で確認できます。

$ curl -s "https://raw.githubusercontent.com/docker-library/python/master/versions.json" | jq '."3.14".variants'
[
  "trixie", # デフォルト
  "slim-trixie",
  "bookworm",
  "slim-bookworm",
  "alpine3.23",
  "alpine3.22",
  "windows/windowsservercore-ltsc2025",
  "windows/windowsservercore-ltsc2022"
]

variants 配列の最初の要素がデフォルトに該当し、trixie (Debian 13) であることが分かります。

$ docker run --rm python:3.14 python -c "import ssl,sys,platform; print(f'{sys.version}\n{ssl.OPENSSL_VERSION}\n{platform.freedesktop_os_release()}')"

3.14.2 (main, Dec  9 2025, 02:48:19) [GCC 14.2.0]
OpenSSL 3.5.4 30 Sep 2025
{'NAME': 'Debian GNU/Linux', 'ID': 'debian', 'PRETTY_NAME': 'Debian GNU/Linux 13 (trixie)', 'VERSION_ID': '13', 'VERSION': '13 (trixie)', 'VERSION_CODENAME': 'trixie', 'DEBIAN_VERSION_FULL': '13.2', 'HOME_URL': 'https://www.debian.org/', 'SUPPORT_URL': 'https://www.debian.org/support', 'BUG_REPORT_URL': 'https://bugs.debian.org/'}

AWS CLI (macOSインストーラー)

macOS向けインストーラー版AWS CLIでPQC対応したエンドポイント(S3等)と通信すると、PQC鍵交換が行われています。

同梱されているOpenSSL(libssl.3.dylib)は3.0.18でPQC非対応ですが、AWSが開発している AWS Common Runtime(CRT)(_awscrt.abi3.so) がPQC通信を担っているようです。

AWS Python SDK(boto3)からAWSとPQC通信する

以上を踏まえて、PythonからAWS Python SDK(boto3)でPQC TLS通信する方法を紹介します。

アプリケーション側の対応

OpenSSL 3.5+が利用できる環境からPQC対応したAWSエンドポイントに対してAPIリクエストを送信するだけで、PQC TLS通信が行われます。

以下のようなサンプルコードで十分です。

import ssl
import sys

import boto3

print(f"Python: {sys.version}")
print(f"OpenSSL: {ssl.OPENSSL_VERSION}")

s3 = boto3.client("s3", region_name="ap-northeast-1")
response = s3.list_buckets()

次のようにして、このコードをDebian 13 (Trixie) ベースの Docker イメージから実行できます。

$ git clone https://github.com/quiver/aws-boto3-pqc-sample.git
$ cd aws-boto3-pqc-sample
$ docker build -t pqc-boto3 .
docker run --rm \
    -e AWS_ACCESS_KEY_ID \
    -e AWS_SECRET_ACCESS_KEY \
    -e AWS_SESSION_TOKEN \
    pqc-boto3

Python: 3.14.2 (main, Dec  8 2025, 23:41:06) [GCC 14.2.0]
OpenSSL: OpenSSL 3.5.4 30 Sep 2025

tcpdump で動作確認

tcpdumpを使って、実際にPQC TLS通信が行われているか確認できます。

sudo tcpdump -w pqc.pcap host s3.ap-northeast-1.amazonaws.com >/dev/null 2>&1

Wiresharkでキャプチャファイルを開き、TLSハンドシェイクの Client Hello メッセージを Transport Layer Security → Handshake Protocol: Client Hello → Extension: key_share と辿っていきましょう。

X25519MLKEM768 の文字があれば、成功です。

古典鍵交換の X25519 と耐量子(格子)暗号の ML-KEM768 のハイブリッド鍵交換が行われていることを意味します。

wireshark-pqc-capture

まとめ

Pythonから PQC 通信する方法を紹介しました。

ポイントはPythonは独自にTLS/SSLを実装しておらず、SSLライブラリとして OpenSSL 3.5 以上を使えばよいことです。

Debian 13(Trixie)以降はOpenSSL 3.5以上のパッケージが提供されており、コンテナ環境であれば、公式Pythonイメージもデフォルトで Trixie を使うようになっています。

また、uvを使ってPythonランタイムをインストールした場合も、python-build-standalone が OpenSSL 3.5.4 を静的リンクしています。

Pythonで実装されているAWS CLIの場合、同梱される AWS Common Runtime(CRT)がPQC対応を済ませているため、ユーザーは気にする必要はありません。

MacOSのデフォルトのPythonはSSLにLibreSSLを使っており、LibreSSLは現時点でPQC対応計画を表明していないことに注意が必要です。代わりに、Homebrewやuvなどでインストールすることをお勧めします。

本記事は、2025年10月に登壇したPQCのOpenSSLトピックを掘り下げたブログです。

参考リンク

この記事をシェアする

FacebookHatena blogX

関連記事