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

如何在OpenSSL中结合SSL_CTX_load_verify_locations使用证书吊销列表?

OpenSSL中证书吊销列表(CRL)的使用方法

核心逻辑说明

SSL_CTX_load_verify_locations()确实支持加载CRL,只是OpenSSL官方手册未在函数文档中单独强调这一点。该函数的核心作用是加载信任根证书,同时若指定的文件/目录中包含PEM格式的CRL,会自动将其加载到证书存储(X509_STORE)中。

关键配置步骤

要让CRL生效,除了通过SSL_CTX_load_verify_locations()加载CRL,还需开启CRL校验标志,具体步骤如下:

  • 创建并初始化SSL上下文,加载自身证书链和私钥
  • 调用SSL_CTX_load_verify_locations()加载信任根证书及CRL(支持单文件同时包含证书和CRL,或存放CRL的目录)
  • 设置证书验证模式(如SSL_VERIFY_PEER强制验证对方证书)
  • 开启CRL校验标志,确保证书验证时检查是否被吊销

修正后的示例代码

#include <openssl/ssl.h>
#include <openssl/x509_vfy.h>

int main() {
    // 初始化OpenSSL库
    SSL_library_init();
    OpenSSL_add_all_algorithms();
    SSL_load_error_strings();

    // 创建服务器端SSL上下文
    SSL_CTX* ssl_ctx = SSL_CTX_new(TLS_server_method());
    if (!ssl_ctx) {
        // 错误处理逻辑
        return -1;
    }

    // 加载服务器证书链与私钥
    if (SSL_CTX_use_certificate_chain_file(ssl_ctx, "server_chain.pem") != 1 ||
        SSL_CTX_use_PrivateKey_file(ssl_ctx, "server_key.pem", SSL_FILETYPE_PEM) != 1) {
        SSL_CTX_free(ssl_ctx);
        return -1;
    }

    // 加载信任根证书及CRL:文件可同时包含根证书和PEM格式CRL
    if (SSL_CTX_load_verify_locations(ssl_ctx, "trusted_certs_and_crls.pem", NULL) != 1) {
        SSL_CTX_free(ssl_ctx);
        return -1;
    }

    // 设置验证模式:要求验证客户端证书
    SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, NULL);

    // 获取证书存储并配置CRL校验
    X509_STORE* cert_store = SSL_CTX_get_cert_store(ssl_ctx);
    if (!cert_store) {
        SSL_CTX_free(ssl_ctx);
        return -1;
    }

    // 开启CRL校验标志,X509_V_FLAG_CRL_CHECK_ALL会检查整个证书链的CRL
    X509_VERIFY_PARAM* verify_param = X509_STORE_get0_param(cert_store);
    X509_VERIFY_PARAM_set_flags(verify_param, X509_V_FLAG_CRL_CHECK | X509_V_FLAG_CRL_CHECK_ALL);

    // 创建SSL对象(后续可绑定套接字进行通信)
    SSL* ssl = SSL_new(ssl_ctx);
    if (!ssl) {
        SSL_CTX_free(ssl_ctx);
        return -1;
    }

    // 后续SSL通信逻辑...

    // 资源释放
    SSL_free(ssl);
    SSL_CTX_free(ssl_ctx);
    return 0;
}

补充说明

  • X509_V_FLAG_CRL_CHECK:仅检查证书直接签发者的CRL
  • X509_V_FLAG_CRL_CHECK_ALL:检查证书链中所有证书的CRL,安全性更严格
  • 若CRL存放在目录中,需先用c_rehash工具生成哈希链接,确保SSL_CTX_load_verify_locations()能正确识别加载

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 19:28:37