You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不设安全级别为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");

注意事项

  1. 不要全局设置SECLEVEL=0,这会启用大量已被废弃的不安全算法,大幅降低系统安全性;
  2. 上述方案均为临时过渡措施,必须尽快将CA证书升级为SHA-256及以上的强签名算法;
  3. 自定义回调时需精准匹配错误码,避免意外放宽其他安全校验规则。

内容的提问来源于stack exchange,提问作者Marek R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 08:06:00