不设安全级别为0,恢复OpenSSL中SHA-1证书指纹兼容性
解决OpenSSL 3.0中SHA-1 CA证书的兼容性问题
问题概述
将C++应用从OpenSSL 1.1.1t升级到3.0.12后,遇到使用RSA 2048+SHA-1签名的CA证书无法启动服务器的问题,报错如下:
2024-03-22 20:01:09 00ac8 Error: Cannot start MyServer. Certificate is invalid: ca md too weak (SSL routines) [asio.ssl:167772558]
OpenSSL 3.0默认安全级别为1,此时SHA-1签名因安全强度不足80位被阻断;而1.1.1t版本默认安全级别同样为1,但未触发该阻断。需求是在不全局降低安全级别到0的前提下,恢复1.1的兼容行为——仅输出告警,允许服务器继续运行,给维护者留时间更新证书。
OpenSSL 1.1与3.0的核心差异
两者默认安全回调ssl_security_default_callback的核心逻辑差异在于对信任链中CA证书签名算法的校验严格度:
- OpenSSL 1.1.1t:安全级别1下,仅对终端实体证书的SHA-1签名进行限制,对CA证书的SHA-1签名未做致命阻断;
- OpenSSL 3.0:安全级别1下,强化了信任链全链路的安全校验,CA证书使用SHA-1签名会直接触发致命错误,阻断服务启动。
解决方案:仅告警不阻断的兼容配置
方法1:自定义安全回调(代码层面)
通过SSL_CTX_set_security_callback拦截特定错误,将CA SHA-1的致命错误转为告警,其他安全校验保持默认逻辑:
#include <openssl/ssl.h> #include <openssl/err.h> #include <stdio.h> static int custom_security_callback(int ok, SSL *ssl, void *arg) { // 先执行默认安全校验逻辑 ok = ssl_security_default_callback(ok, ssl, arg); if (ok == 0) { unsigned long err_code = ERR_peek_last_error(); // 匹配"ca md too weak"错误码 if (ERR_GET_LIB(err_code) == ERR_LIB_SSL && ERR_GET_REASON(err_code) == SSL_R_CA_MD_TOO_WEAK) { // 输出告警信息 fprintf(stderr, "[WARNING] CA证书使用SHA-1弱签名,请尽快更新证书!\n"); // 返回1允许服务继续启动 return 1; } } // 其他错误保持默认拒绝逻辑 return ok; } // 在SSL_CTX初始化时绑定回调 SSL_CTX *init_server_ctx() { SSL_CTX *ctx = SSL_CTX_new(TLS_server_method()); if (ctx == NULL) { // 错误处理 return NULL; } // 设置自定义安全回调 SSL_CTX_set_security_callback(ctx, custom_security_callback, NULL); // 其他初始化步骤(加载证书、设置协议等) return ctx; }
方法2:局部放宽OpenSSL配置(无需改代码)
修改OpenSSL配置文件(如/etc/ssl/openssl.cnf或自定义配置),在[system_default_sect]中添加针对CA证书SHA-1的放宽规则,同时保持全局安全级别1:
[system_default_sect] MinProtocol = TLSv1.2 CipherString = DEFAULT@SECLEVEL=1 # 允许CA证书使用SHA-1签名 SignatureAlgorithms = RSA+SHA1:ECDSA+SHA1:@SECLEVEL=1 # 针对CMS签名的额外放宽(若涉及) CmsSignatureAlgorithms = RSA+SHA1:ECDSA+SHA1:@SECLEVEL=1
启动应用时指定该配置文件:
export OPENSSL_CONF=/path/to/your/custom_openssl.cnf ./your_server_binary
或在代码中加载配置:
SSL_CTX_load_verify_locations(ctx, NULL, "/path/to/your/custom_openssl.cnf");
注意事项
- 不要全局设置
SECLEVEL=0,这会启用大量已被废弃的不安全算法,大幅降低系统安全性; - 上述方案均为临时过渡措施,必须尽快将CA证书升级为SHA-256及以上的强签名算法;
- 自定义回调时需精准匹配错误码,避免意外放宽其他安全校验规则。
内容的提问来源于stack exchange,提问作者Marek R
相关产品推荐
相关产品推荐

