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

如何在OpenSSL的SSL Context中加载2个RSA SSL证书到内存并同时生效

OpenSSL多证书同时生效实现方案

核心问题说明

你现有代码仅调用了一次证书和私钥加载接口,仅加载了Symantec证书,因此只有该证书生效。OpenSSL 1.1.1版本原生支持单SSL_CTX上下文加载多组证书+私钥对,无需额外依赖。

代码修改步骤

1. 变量准备

提前定义好两份证书的路径变量:

  • Symantec证书路径:keyfile_symantec(即你原代码中的keyfile)
  • Zuul证书路径:keyfile_zuul
    如果两份证书的解压密码不同,需要提前在密码回调函数password_cb中新增区分逻辑,通过用户传入参数识别当前加载的是哪份证书,返回对应密码即可。

2. 证书加载逻辑修改

将原有单证书加载逻辑替换为两次加载逻辑,示例代码如下:

/* 原有全局初始化、SSL_CTX创建逻辑保留不变 */

/* 加载第一份Symantec证书 */
if(status==true && !(SSL_CTX_use_certificate_file(server_ctx, keyfile_symantec, SSL_FILETYPE_PEM)))
{ 
    status = false; 
    LOG(LEVEL1,"Error!!! 读取Symantec证书失败: %s", ERR_error_string(ERR_get_error(), NULL));    
}

if(status==true && !(SSL_CTX_use_PrivateKey_file(server_ctx, keyfile_symantec, SSL_FILETYPE_PEM)))
{       
    LOG(LEVEL1,"Error!!! 读取Symantec私钥失败: %s", ERR_error_string(ERR_get_error(), NULL));    
    status = false;
}

/* 新增加载第二份Zuul证书 */
if(status==true && !(SSL_CTX_use_certificate_file(server_ctx, keyfile_zuul, SSL_FILETYPE_PEM)))
{ 
    status = false; 
    LOG(LEVEL1,"Error!!! 读取Zuul证书失败: %s", ERR_error_string(ERR_get_error(), NULL));    
}

if(status==true && !(SSL_CTX_use_PrivateKey_file(server_ctx, keyfile_zuul, SSL_FILETYPE_PEM)))
{       
    LOG(LEVEL1,"Error!!! 读取Zuul私钥失败: %s", ERR_error_string(ERR_get_error(), NULL));    
    status = false;
}

/* 新增校验所有私钥与证书匹配 */
if(status==true && !SSL_CTX_check_private_key(server_ctx))
{
    LOG(LEVEL1,"Error!!! 私钥与证书公钥不匹配: %s", ERR_error_string(ERR_get_error(), NULL));
    status = false;
}

/* 原有CA加载、校验配置、密码回调设置等逻辑保留不变 */

适配场景说明

  • 如果两份证书对应不同域名,需要额外配置SNI回调:调用SSL_CTX_set_tlsext_servername_callback设置自定义回调函数,客户端握手时携带SNI域名,回调中匹配对应证书返回即可,无SNI的请求默认返回第一份加载的证书。
  • 如果两份证书使用不同加密算法(如一份RSA、一份ECC),OpenSSL会自动根据客户端支持的算法匹配对应证书返回,无需额外配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 13:48:02