?*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.
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.根据您提供的 CHANGES.md 文件和 OpenSSL 3.5 的发布信息,OpenSSL 3.5 引入了以下后量子算法:
MLKEM512 - 提供约128位安全级别
MLKEM768 - 提供约128位安全级别(推荐)
MLKEM1024 - 提供约192位安全级别
混合密钥交换算法
将传统椭圆曲线算法与 ML-KEM 结合:
X25519MLKEM768 - X25519 + MLKEM768 混合
SecP256r1MLKEM768 - P-256 + MLKEM768 混合
SecP384r1MLKEM1024 - P-384 + MLKEM1024 混合
ML-DSA-44 - 提供约128位安全级别
ML-DSA-65 - 提供约192位安全级别
ML-DSA-87 - 提供约256位安全级别
混合密钥(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密钥)
安全优势
#查看支持哪些命令
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一个后量子混合密钥交换算法。
//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 删除。