综合 OpenSSL 4.0.0 发布:SSLv3 和 engine 正式移除,ECH 与后量子算法进来,升级前先改这些 API

2026-10-09 20:01:47

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_HMAC API 时,现在强制下界检查。
  • 设置 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)一并算进去。

推荐文章

程序员茄子在线接单