QianHeng乾珩 PQC Docs Hub量子文档 ✦ Ask AI✦ 问问文档 ⚐ Scan⚐ 扫一扫

Post-Quantum OpenSSL

OpenSSL 3.5 (2025) ships native ML-KEM, ML-DSA, and SLH-DSA — no third-party provider required for the FIPS algorithms. For the not-yet-standardized schemes, the OQS oqs-provider extends OpenSSL 3 the same way. This page covers both paths with real commands.

Path 1: native PQC in OpenSSL 3.5+

Confirm your version and what is built in. From 3.5 the FIPS KEM and signature algorithms appear with no extra configuration:

openssl version            # expect 3.5.0 or newer

# List the post-quantum KEMs and groups now available natively
openssl list -kem-algorithms | grep -i mlkem
openssl list -signature-algorithms | grep -Ei 'ml-dsa|slh-dsa'

Generate keys and sign

ML-DSA keys and signatures use the standard genpkey / pkeyutl workflow:

# Generate an ML-DSA-65 private key
openssl genpkey -algorithm ML-DSA-65 -out mldsa65.key

# Derive the public key
openssl pkey -in mldsa65.key -pubout -out mldsa65.pub

# Sign and verify a message
openssl pkeyutl -sign  -inkey mldsa65.key -rawin -in message.txt -out message.sig
openssl pkeyutl -verify -pubin -inkey mldsa65.pub -rawin -in message.txt -sigfile message.sig

Negotiate a post-quantum TLS handshake

The recommended deployment is a hybrid group such as X25519MLKEM768, which pairs classical X25519 with ML-KEM-768:

# Client side: request the hybrid group explicitly
openssl s_client -connect example.com:443 -groups X25519MLKEM768

# Experimental example only: a pure PQ group is not the default production recommendation
openssl s_client -connect example.com:443 -groups MLKEM768

# Server side: restrict the offered groups
openssl s_server -accept 4433 -cert server.crt -key server.key \
  -groups X25519MLKEM768:X25519

For production migration, the recommended choice is a hybrid group such as X25519MLKEM768; a pure PQ group is only for experiments or specific interoperability testing and should not be the default production recommendation. Inspect the negotiated group in the handshake output — OpenSSL reports the selected key-exchange group, confirming the post-quantum exchange actually happened.

Path 2: the oqs-provider (everything else)

For Classic McEliece, HQC, BIKE, FrodoKEM, or Falcon — algorithms OpenSSL does not ship natively — build the OQS provider against liboqs:

# Build oqs-provider against an installed liboqs
git clone --depth 1 https://github.com/open-quantum-safe/oqs-provider.git
cd oqs-provider
cmake -S . -B build -Dliboqs_DIR=/usr/local/lib/cmake/liboqs
cmake --build build
sudo cmake --install build

Load it from your OpenSSL configuration so both the default and OQS providers are active:

# openssl.cnf
[openssl_init]
providers = provider_sect

[provider_sect]
default = default_sect
oqsprovider = oqsprovider_sect

[default_sect]
activate = 1

[oqsprovider_sect]
activate = 1

With the provider loaded, the OQS algorithms appear alongside the native ones:

# Point at your config and enumerate the now-expanded list
OPENSSL_CONF=./openssl.cnf openssl list -kem-algorithms | grep -Ei 'mceliece|hqc|bike'

# Generate a Falcon key via the provider
OPENSSL_CONF=./openssl.cnf openssl genpkey -algorithm falcon512 -out falcon512.key

Which path do I use?

  • ML-KEM / ML-DSA / SLH-DSA — prefer OpenSSL 3.5+ native support; for compliance use, verify the specific FIPS provider, module version, certificate number, and parameter-set boundary.
  • Experimental KEMs and Falcon — use oqs-provider.
  • Stuck on OpenSSL 3.0–3.4? Use oqs-provider for everything, or upgrade to 3.5 for the native FIPS algorithms.
Warning
Algorithm and group names differ between native OpenSSL and the oqs-provider (e.g. X25519MLKEM768 vs older x25519_mlkem768 spellings), and have shifted across draft revisions. Always confirm the exact name with openssl list -kem-algorithms on your build rather than copying strings from old tutorials — a wrong name fails silently as "no shared group."

Related

Standards & references

后量子 OpenSSL

OpenSSL 3.5(2025 年版)原生内置 ML-KEM、ML-DSA 与 SLH-DSA,使用这些 FIPS 算法无需第三方 provider;对尚未标准化的算法,OQS 的 oqs-provider 则以同样方式扩展 OpenSSL 3。本页用真实命令覆盖这两条路径。

路径一 OpenSSL 3.5+ 原生 PQC

先确认版本并查看内置算法。从 3.5 起,FIPS KEM 与签名算法无需额外配置即可出现:

openssl version            # expect 3.5.0 or newer

# 列出现在原生可用的后量子 KEM 与组
openssl list -kem-algorithms | grep -i mlkem
openssl list -signature-algorithms | grep -Ei 'ml-dsa|slh-dsa'

生成密钥并签名

ML-DSA 的密钥与签名沿用标准的 genpkeypkeyutl 流程:

# 生成 ML-DSA-65 私钥
openssl genpkey -algorithm ML-DSA-65 -out mldsa65.key

# 导出公钥
openssl pkey -in mldsa65.key -pubout -out mldsa65.pub

# 对消息签名并验证
openssl pkeyutl -sign  -inkey mldsa65.key -rawin -in message.txt -out message.sig
openssl pkeyutl -verify -pubin -inkey mldsa65.pub -rawin -in message.txt -sigfile message.sig

协商后量子 TLS 握手

推荐部署为混合组,例如 X25519MLKEM768,将经典 X25519 与 ML-KEM-768 配对:

# 客户端 显式请求混合组
openssl s_client -connect example.com:443 -groups X25519MLKEM768

# 仅作实验示例 纯 PQ 组不应作为默认生产建议
openssl s_client -connect example.com:443 -groups MLKEM768

# 服务端 限定提供的组
openssl s_server -accept 4433 -cert server.crt -key server.key \
  -groups X25519MLKEM768:X25519

生产迁移推荐使用混合组,例如 X25519MLKEM768;纯 PQ 组仅用于实验或特定互操作测试,不应作为默认生产建议。在握手输出中查看协商出的组 OpenSSL 会报告所选密钥交换组 以确认后量子交换确已发生。

路径二 oqs-provider 覆盖其余算法

对于 OpenSSL 未原生提供的 Classic McEliece、HQC、BIKE、FrodoKEM 或 Falcon,需针对 liboqs 构建 OQS provider:

# 针对已安装的 liboqs 构建 oqs-provider
git clone --depth 1 https://github.com/open-quantum-safe/oqs-provider.git
cd oqs-provider
cmake -S . -B build -Dliboqs_DIR=/usr/local/lib/cmake/liboqs
cmake --build build
sudo cmake --install build

在 OpenSSL 配置中加载它,让默认 provider 与 OQS provider 同时生效:

# openssl.cnf
[openssl_init]
providers = provider_sect

[provider_sect]
default = default_sect
oqsprovider = oqsprovider_sect

[default_sect]
activate = 1

[oqsprovider_sect]
activate = 1

provider 加载后,OQS 算法会与原生算法一同出现:

# 指向配置并枚举扩充后的列表
OPENSSL_CONF=./openssl.cnf openssl list -kem-algorithms | grep -Ei 'mceliece|hqc|bike'

# 通过 provider 生成 Falcon 密钥
OPENSSL_CONF=./openssl.cnf openssl genpkey -algorithm falcon512 -out falcon512.key

该用哪条路径

  • ML-KEM、ML-DSA、SLH-DSA——优先用 OpenSSL 3.5+ 原生支持;合规使用时需核对具体 FIPS provider、模块版本、证书编号和参数集边界。
  • 实验性 KEM 与 Falcon——用 oqs-provider
  • 仍停留在 OpenSSL 3.0 到 3.4——全部用 oqs-provider,或升级到 3.5 以获取原生 FIPS 算法。
警告
算法与组的名称在原生 OpenSSL 与 oqs-provider 之间不同 例如 X25519MLKEM768 与旧式 x25519_mlkem768 写法 且在各草案修订间多次变动 务必在你自己的构建上用 openssl list -kem-algorithms 确认确切名称 不要照抄旧教程中的字符串 名称写错会以无共享组的形式悄然失败。

相关

标准与参考

⚑ Report an error⚑ 纠错与校正