
Pythonで耐量子暗号(PQC)対応のOpenSSLを使うには? インストール方式別の対応状況まとめ
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 | 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対応を積極的に進めてきました。
- Why Google now uses post-quantum cryptography for internal comms | Google Cloud Blog
- ImperialViolet - BoringSSL
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サポート
- https://github.com/astral-sh/python-build-standalone/pull/782
- https://github.com/astral-sh/python-build-standalone/issues/775
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/python の versions.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 のハイブリッド鍵交換が行われていることを意味します。

まとめ
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トピックを掘り下げたブログです。








