SSL_CTX_add_extra_chain_cert
时间: 2024-09-10 14:10:31 浏览: 86
`SSL_CTX_add_extra_chain_cert` 是一个用于操作 SSL/TLS 证书链的函数,它属于 OpenSSL 库的一部分。该函数的作用是将额外的证书添加到 SSL 上下文的证书链中,通常这个额外的证书是服务器的中间证书。在 TLS 握手过程中,服务器会发送其证书链给客户端,客户端需要验证这个证书链的有效性。
通过使用 `SSL_CTX_add_extra_chain_cert` 函数,可以确保客户端在验证服务器证书链时包括了所有必需的中间证书。这样可以减少客户端因为缺少中间证书而无法建立安全连接的情况。
函数的基本使用方式如下:
```c
int SSL_CTX_add_extra_chain_cert(SSL_CTX *ctx, X509 *x);
```
其中 `ctx` 是 SSL 上下文对象,`x` 是需要添加到证书链中的额外证书。
需要注意的是,这个函数已经不推荐使用,因为它有一些潜在的问题,可能会导致证书链的处理不正确。OpenSSL 建议使用 `SSL_CTX_get0_chain_certs` 和 `SSL_CTX_build_cert_chain` 函数来处理证书链。
相关问题
下面的代码 参数证书路径 对应的证书需要是什么格式的 #include <openssl/ssl.h> #include <openssl/bio.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> int https_request(const char* cert_file, const char* payload) { SSL_CTX* ctx = NULL; SSL* ssl = NULL; BIO* bio = NULL; int ret = -1; SSL_library_init(); ctx = SSL_CTX_new(SSLv23_client_method()); if(!ctx) { fprintf(stderr, "SSL_CTX_new failed!\n"); goto END; } if(SSL_CTX_load_verify_locations(ctx, cert_file, NULL) <= 0) { fprintf(stderr, "SSL_CTX_load_verify_locations failed!\n"); goto END; } if(SSL_CTX_use_certificate_file(ctx, cert_file, SSL_FILETYPE_PEM) <= 0) { fprintf(stderr, "SSL_CTX_use_certificate_file failed!\n"); goto END; } if(SSL_CTX_use_PrivateKey_file(ctx, cert_file, SSL_FILETYPE_PEM) <= 0) { fprintf(stderr, "SSL_CTX_use_PrivateKey_file failed!\n"); goto END; } bio = BIO_new_ssl_connect(ctx); if(!bio) { fprintf(stderr, "BIO_new_ssl_connect failed!\n"); goto END; } if(BIO_set_conn_hostname(bio, "www.example.com:https") <= 0) { fprintf(stderr, "BIO_set_conn_hostname failed!\n"); goto END; } BIO_get_ssl(bio, &ssl); if(!ssl) { fprintf(stderr, "BIO_get_ssl failed!\n"); goto END; } SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY); if(BIO_do_connect(bio) <= 0) { fprintf(stderr, "BIO_do_connect failed!\n"); goto END; } if(SSL_get_verify_result(ssl) != X509_V_OK) { fprintf(stderr, "SSL_get_verify_result error!\n"); goto END; } if(BIO_write(bio, payload, strlen(payload)) <= 0) { fprintf(stderr, "BIO_write failed!\n"); goto END; } char buf[1024] = {0}; int n = 0; while((n = BIO_read(bio, buf, sizeof(buf))) > 0) { fwrite(buf, 1, n, stdout); } ret = 0; END: if(bio) { BIO_free_all(bio); } if(ctx) { SSL_CTX_free(ctx); } return ret; }
该代码中的参数证书路径对应的证书需要是 PEM 格式的。其中 SSL_CTX_use_certificate_file 和 SSL_CTX_use_PrivateKey_file 函数加载的证书也需要是 PEM 格式的。在 SSL_CTX_load_verify_locations 函数中,如果第二个参数为 NULL,则使用系统默认的证书库。如果需要使用自定义的证书库,则可以通过第二个参数指定证书库的路径。
SSL_CTX *ctx = SSL_CTX_new(TLS_server_method());
在这行代码中,`SSL_CTX_new(TLS_server_method())` 是用于创建 SSL/TLS 上下文的函数调用。SSL/TLS 上下文(SSL context)是一个数据结构,它保存了 SSL/TLS 相关的配置信息和状态,用于建立和管理 SSL/TLS 连接。
`TLS_server_method()` 是一个函数,用于获取一个 SSL/TLS 服务器方法(SSL/TLS server method)。通过调用这个函数,可以创建一个 SSL/TLS 上下文,用于支持服务器端的 SSL/TLS 连接。
示例代码:
```c
#include <openssl/ssl.h>
int main() {
// 创建 SSL/TLS 上下文
SSL_CTX *ctx = SSL_CTX_new(TLS_server_method());
// 其他操作...
// 清理上下文
SSL_CTX_free(ctx);
return 0;
}
```
在实际使用中,创建 SSL/TLS 上下文后,可以通过设置一些配置参数(例如证书、私钥、加密算法等)来定制 SSL/TLS 连接的行为。创建好的上下文可以在后续的 SSL/TLS 通信中重复使用。最后,需要使用 `SSL_CTX_free()` 函数来释放上下文资源,避免内存泄漏。
阅读全文