如何在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:仅检查证书直接签发者的CRLX509_V_FLAG_CRL_CHECK_ALL:检查证书链中所有证书的CRL,安全性更严格- 若CRL存放在目录中,需先用
c_rehash工具生成哈希链接,确保SSL_CTX_load_verify_locations()能正确识别加载
内容的提问来源于stack exchange,提问作者user180574
相关产品推荐
相关产品推荐

