首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >openssl 3.5+命令行实现后量子算法(PQC)版本的mTLS双向认证

openssl 3.5+命令行实现后量子算法(PQC)版本的mTLS双向认证

原创
作者头像
Uncle匠
发布2025-09-16 21:20:12
发布2025-09-16 21:20:12
100
代码可运行
举报
运行总次数:0
代码可运行

结论

  • openssl3.5+开始引入ML-KEM、ML-DSA和SLH-DSA 后量子算法,并在TLS1.3协议中添加了对应的后量子ML-KEM相关密钥交换算法和混合密钥交换算法。
  • openssl3.5+的TLS中默认只开启了X25519MLKEM768这个混合密钥交换算法,其他默认没开启,需要显式指定。3.4和3.5的具体的差异,可以查看CHANGES.md,有详细说明。

openssl 3.5与3.4的主要差异

Changes between 3.4 and 3.5.0 8 Apr 2025

  • The default TLS group list setting is now set to: ?*X25519MLKEM768 / ?*X25519:?secp256r1 / ?X448:?secp384r1:?secp521r1 / ?ffdhe2048:?ffdhe3072

This means two key shares (X25519MLKEM768 and X25519) will be sent by

default by the TLS client. GOST groups and FFDHE groups larger than 3072

bits are no longer enabled by default.

The group names in the group list setting are now also case insensitive.

  • Support DEFAULT keyword and '-' prefix in SSL_CTX_set1_groups_list(). SSL_CTX_set1_groups_list() now supports the DEFAULT keyword which sets the available groups to the default selection. The '-' prefix allows the calling application to remove a group from the selection.

差异AI解读

根据您提供的 CHANGES.md 文件和 OpenSSL 3.5 的发布信息,OpenSSL 3.5 引入了以下后量子算法:

  1. 密钥封装机制 (KEM - Key Encapsulation Mechanism) ML-KEM (Module-Lattice Key Encapsulation Mechanism) 基于 NIST FIPS 203 标准,包括以下变体:

MLKEM512 - 提供约128位安全级别

MLKEM768 - 提供约128位安全级别(推荐)

MLKEM1024 - 提供约192位安全级别

混合密钥交换算法

将传统椭圆曲线算法与 ML-KEM 结合:

X25519MLKEM768 - X25519 + MLKEM768 混合

SecP256r1MLKEM768 - P-256 + MLKEM768 混合

SecP384r1MLKEM1024 - P-384 + MLKEM1024 混合

  1. 数字签名算法 (Digital Signature Algorithm) ML-DSA (Module-Lattice Digital Signature Algorithm) 基于 NIST FIPS 204 标准,包括以下变体:

ML-DSA-44 - 提供约128位安全级别

ML-DSA-65 - 提供约192位安全级别

ML-DSA-87 - 提供约256位安全级别

  1. 状态哈希签名算法 (Stateful Hash-Based Signature) SLH-DSA (SPHINCS+-Haraka-AES-SHAKE Digital Signature Algorithm) 基于 NIST FIPS 205 标准

什么是混合密钥?

混合密钥(Hybrid Key Exchange)的含义

混合密钥是指在一次密钥交换过程中同时使用两种或多种不同数学基础的密钥交换算法,以提供更强的安全保障。

工作原理

传统单一密钥交换:

客户端 → 生成ECDH密钥对 → 发送公钥 → 服务器

服务器 → 生成ECDH密钥对 → 发送公钥 → 客户端

双方 → 计算共享密钥(ECDH) → 用于会话加密

混合密钥交换:

客户端 → 生成X25519密钥对 + MLKEM768密钥对 → 发送两个公钥 → 服务器

服务器 → 生成X25519密钥对 + MLKEM768密钥对 → 发送两个公钥 → 客户端

双方 → 计算X25519共享密钥 + MLKEM768共享密钥 → 组合 → 用于会话加密

-groups X25519MLKEM768:MLKEM768:P-256:X25519

各组的含义:

X25519MLKEM768(混合算法)

传统部分:X25519(椭圆曲线 Diffie-Hellman)

后量子部分:MLKEM768(模块格密钥封装机制)

安全性:双重保护,约128位安全级别

MLKEM768(纯后量子)

纯后量子密钥封装机制

抗量子计算机攻击

P-256(传统椭圆曲线)

NIST P-256椭圆曲线Diffie-Hellman

传统安全级别

X25519(传统椭圆曲线)

Curve25519 Diffie-Hellman

现代高效的传统算法

实际工作流程

密钥生成阶段:

客户端生成:

├── X25519密钥对 (传统)

├── MLKEM768密钥对 (后量子)

└── 将两个公钥打包发送

服务器生成:

├── X25519密钥对 (传统)

├── MLKEM768密钥对 (后量子)

└── 将两个公钥打包发送

密钥交换阶段:

客户端计算:

├── X25519共享密钥 = ECDH(客户端私钥, 服务器公钥)

├── MLKEM768共享密钥 = MLKEM.Decaps(客户端私钥, 服务器密文)

└── 最终密钥 = KDF(X25519密钥 || MLKEM768密钥)

服务器计算:

├── X25519共享密钥 = ECDH(服务器私钥, 客户端公钥)

├── MLKEM768共享密钥 = MLKEM.Encaps(服务器公钥) → 生成密文和密钥

└── 最终密钥 = KDF(X25519密钥 || MLKEM768密钥)

安全优势

  1. 双重保险 场景1:量子计算机破解传统算法 → 后量子部分仍安全 场景2:后量子算法被发现漏洞 → 传统部分仍安全 场景3:两种算法都被破解 → 极低概率
  2. 平滑过渡 兼容现有系统 逐步迁移到后量子密码学 不中断现有服务

后量子算法的mTLS脚本样例

代码语言:shell
复制
#查看支持哪些命令
openssl list -h

#查看后量子算法支持情况
openssl list -all-algorithms | grep -i ML

#生成MS-DSA的CA私钥,对应查看命令:openssl pkey -in ca-key.pem -text -noout
openssl genpkey -algorithm ML-DSA-44 -out ca-key.pem
#生成CA根证书
openssl req -x509 -new -key ca-key.pem -days 365  -out ca-cert.pem -subj "/CN=Post-Quantum-CA"
#生成服务端私钥
openssl genpkey -algorithm ML-DSA-44 -out server-key.pem
#生成服务端证书请求
openssl req -new -key server-key.pem -out  server-csr.pem -subj "/CN=localhost"
#生成服务端证书
openssl x509 -req -in server-csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem -days 365

#生成客户端私钥
openssl genpkey -algorithm ML-DSA-44 -out client-key.pem
#生成客户端请求
openssl req -new -key client-key.pem -out  client-csr.pem -subj "/CN=client"
#生成客户端证书
openssl x509 -req -in client-csr.pem -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem -days 365

#开启tls服务端并开启双向认证,注意自带的s_server单线程,一次只支持一个客户端连接,如果有多个客户端连接,其他都会被pending,直到前一个连接释放
openssl s_server -accept 4433  -cert server-cert.pem -key server-key.pem -CAfile ca-cert.pem -Verify 1 -groups SecP384r1MLKEM1024:SecP256r1MLKEM768:MLKEM1024:MLKEM768:MLKEM512:X25519MLKEM768 -state -verify_return_error
#开启tls客户端设置客户端证书
openssl s_client -connect localhost:4433 -cert client-cert.pem -key client-key.pem -CAfile ca-cert.pem  -groups SecP384r1MLKEM1024:SecP256r1MLKEM768:MLKEM1024:MLKEM768:MLKEM512:X25519MLKEM768 -status -verify_return_error

注意-groups参数,可以按需设置对应的密钥交换组算法,排前面的优先选择,根据前面的差异说明,不设置默认只设置X25519MLKEM768一个后量子混合密钥交换算法。

源码分析

代码语言:c
代码运行次数:0
运行
复制
//capabilities.c
# define OSSL_TLS_GROUP_ID_mlkem512         0x0200
# define OSSL_TLS_GROUP_ID_mlkem768         0x0201
# define OSSL_TLS_GROUP_ID_mlkem1024        0x0202
# define OSSL_TLS_GROUP_ID_SecP256r1MLKEM768  0x11EB
# define OSSL_TLS_GROUP_ID_X25519MLKEM768     0x11EC
# define OSSL_TLS_GROUP_ID_SecP384r1MLKEM1024 0x11ED

static const OSSL_PARAM param_group_list[][11] = {
# ifndef OPENSSL_NO_EC
#  if !defined(OPENSSL_NO_ML_KEM)
#   if !defined(OPENSSL_NO_ECX)
    TLS_GROUP_ENTRY("X25519MLKEM768", "", "X25519MLKEM768", 41),
#   endif
//...
# if !defined(OPENSSL_NO_ML_KEM)
    /* https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-8 */
    TLS_GROUP_ENTRY("MLKEM512", "", "ML-KEM-512", 38),
    TLS_GROUP_ENTRY("MLKEM768", "", "ML-KEM-768", 39),
    TLS_GROUP_ENTRY("MLKEM1024", "", "ML-KEM-1024", 40),
# endif
//...
#  ifndef OPENSSL_NO_ML_KEM
    TLS_GROUP_ENTRY("SecP256r1MLKEM768", "", "SecP256r1MLKEM768", 42),
    TLS_GROUP_ENTRY("SecP384r1MLKEM1024", "", "SecP384r1MLKEM1024", 43),
#  endif
//...
};

//tlsgroups.h
/* 38 */ { OSSL_TLS_GROUP_ID_mlkem512, ML_KEM_512_SECBITS, TLS1_3_VERSION, 0, -1, -1, 1 },
/* 39 */ { OSSL_TLS_GROUP_ID_mlkem768, ML_KEM_768_SECBITS, TLS1_3_VERSION, 0, -1, -1, 1 },
/* 40 */ { OSSL_TLS_GROUP_ID_mlkem1024, ML_KEM_1024_SECBITS, TLS1_3_VERSION, 0, -1, -1, 1 },
/* 41 */ { OSSL_TLS_GROUP_ID_X25519MLKEM768, ML_KEM_768_SECBITS, TLS1_3_VERSION, 0, -1, -1, 1 },
/* 42 */ { OSSL_TLS_GROUP_ID_SecP256r1MLKEM768, ML_KEM_768_SECBITS, TLS1_3_VERSION, 0, -1, -1, 1 },
/* 43 */ { OSSL_TLS_GROUP_ID_SecP384r1MLKEM1024, ML_KEM_1024_SECBITS, TLS1_3_VERSION, 0, -1, -1, 1 },

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 结论
  • openssl 3.5与3.4的主要差异
    • Changes between 3.4 and 3.5.0 8 Apr 2025
    • 差异AI解读
      • 什么是混合密钥?
      • 后量子算法的mTLS脚本样例
    • 源码分析
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档