OpenSSL 4.0.0 发布:SSLv3 和 engine 正式移除,ECH 与后量子算法进来,升级前先改这些 API
OpenSSL 4.0.0 于 2026-04-14 发布,是一个 feature release。4.0 不是 LTS 版本:按 OpenSSL 的 LTS 政策,4.0 支持到 2027-05-14,下一个版本 OpenSSL 4.1 计划在 2026-10 发布。
相关链接:
- 发布公告:https://openssl-library.org/post/2026-04-14-openssl-40-final-release/
- GitHub discussion #30825:https://github.com/openssl/openssl/discussions/30825
- CHANGES.md(openssl-4.0.0 分支):https://github.com/openssl/openssl/blob/openssl-4.0.0/CHANGES.md
破坏性变更
- 打印密钥数据(例如 RSA modulus)为十六进制时,如果最高位字节 >= 0x80,不再额外输出前导的
00:。 - 十六进制 dump 的宽度统一:签名 24 字节,其他 16 字节。
- 在 FIPS provider 下使用
PKCS5_PBKDF2_HMACAPI 时,现在强制下界检查。 - 设置
X509_V_FLAG_X509_STRICT时新增 AKID 校验。 - CRL 校验流程增加了若干额外检查。
- libcrypto 不再通过
atexit()清理全局分配的数据。 BIO_snprintf()改用 libc 提供的snprintf(),不再使用内部实现。OPENSSL_cleanup()现在在全局析构函数中运行,默认情况下可能完全不运行。ASN1_STRING变为 opaque。- 大量 API 函数签名变更,包括 X509 处理相关函数,参数和返回类型加上了
const限定。 - 弃用
X509_cmp_time()、X509_cmp_current_time()、X509_cmp_timeframe(),改用X509_check_certificate_times()。 - 移除 SSLv2 Client Hello 支持。
- 移除 SSLv3 支持(2015 年起弃用,2016 年 1.1.0 起默认禁用)。
- 移除 engine 支持。
no-engine构建选项和OPENSSL_NO_ENGINE宏始终存在。 - 按 RFC 8422 在 TLS 中使用弃用椭圆曲线,现在默认在编译期禁用。要启用,使用配置项
enable-tls-deprecated-ec。 - 显式 EC 曲线(explicit EC curves)默认在编译期禁用。要启用,使用配置项
enable-ec_explicit_curves。 - 移除
c_rehash脚本工具,改用openssl rehash。 openssl ca命令移除弃用的msie-hack选项。- 移除
BIO_f_reliable()实现,没有替代。该实现自 3.0 发布起就是坏的,且无人反馈。 - 移除对自定义
EVP_CIPHER、EVP_MD、EVP_PKEY、EVP_PKEY_ASN1方法的弃用支持。 - 移除弃用的固定 SSL/TLS 版本方法函数。
- 移除弃用的
ERR_get_state()、ERR_remove_state()、ERR_remove_thread_state()。ERR_STATE对象现在始终 opaque。 Configurations中移除darwin-i386{,-cc}与darwin-ppc{,64}{,-cc}目标。
新特性
- 支持 Encrypted Client Hello(ECH,RFC 9849),见
doc/designs/ech-api.md。 - 支持 RFC 8998,新增签名算法
sm2sig_sm3、密钥交换组curveSM2,以及后量子组tls-hybrid-sm2-mlkem/curveSM2MLKEM768。 - 按 SP 800-185 支持 cSHAKE 函数。
- 支持 "ML-DSA-MU" 摘要算法。
- 支持 SNMP KDF 和 SRTP KDF。
- 安装 FIPS 模块时,可用
openssl fipsinstall命令的-defer_tests选项延后 FIPS 自检,按需运行。 - Windows 上支持静态或动态 VC runtime 链接。
- TLS 1.2 中按 RFC 7919 支持协商式 FFDHE 密钥交换。
3.6 到 4.0.0 之间的命令行与 API 变化
openssl s_client和openssl s_server新增-expected-rpks选项,用于指定期望从对端获得的、用于认证连接的一个或多个公钥。openssl dgst新增-hmac-env和-hmac-stdin选项。openssl pkeyutl新增 LMS 签名验证支持。- 新增
SSL_get0_sigalg()和SSL_get0_shared_sigalg(),用于报告 TLS 签名算法名称/码点;取代只适用于 TLS 1.2 的SSL_get_sigalgs()/SSL_get_shared_sigalgs()。名称现在使用 IANA 名称,与SignatureAlgorithms配置一致。openssl s_client/s_server如今打印形如Signature Algorithms: mldsa65:mldsa87:mldsa44:ecdsa_secp256r1_sha256:...:rsa_pkcs1_sha256:...的内容。 - 实现客户端侧 predicted keyshare floating;keyshare 由元组中第一个剩余元素继承。
- 实现
OSSL_STORE对EVP_SKEY对象的支持:openssl enc新增-skeyuri和-storepass选项,openssl storeutl新增-skeys选项,新增OSSL_STORE_INFO_SKEY类型。
升级注意
engine 与已弃用 EVP 方法的移除,会影响依赖 ENGINE 加载硬件加速或第三方密码实现的代码,这部分需要改到 provider 接口;no-engine 与 OPENSSL_NO_ENGINE 始终生效,无需再用条件编译绕开。
需要继续使用弃用 EC 曲线的场景,必须在编译时显式开启 enable-tls-deprecated-ec、enable-ec_explicit_curves,即默认构建产物不会包含这些曲线,升级时若沿用旧的构建配置脚本会直接失去支持。
脚本层面,c_rehash 已不存在,替换为 openssl rehash;openssl ca 的 msie-hack 选项也已删除。
此外 OPENSSL_cleanup() 现在运行于全局析构函数中,默认可能不执行;不再依赖 atexit() 做全局清理,进程退出路径上的资源释放逻辑需要重新确认。考虑到 4.0 支持期只到 2027-05-14,如果计划长期维护,路线图里应把 4.1(2026-10)一并算进去。