OpenSSL API 在使用 SSL_get_certificate() 时崩溃

OpenSSL API's crashing while using SSL_get_certificate()

本文关键字:certificate 崩溃 get OpenSSL SSL API      更新时间:2023-10-16

以下命令打印所述主机的SHA1指纹

openssl s_client-连接主机名:端口|openssl x509-指纹-nout

为了使用c++完成相同的操作,我使用ssl API

#include"openssl/ssl.h"
#include"openssl/bio.h"
#include "openssl/err.h"
#include<iostream>
using namespace std;
int main()
{    
    SSL_CTX * ctx = SSL_CTX_new(SSLv23_client_method());
    SSL * ssl;
    BIO * bio;
    SSL_library_init();
    bio = BIO_new_ssl_connect(ctx);
    BIO_set_conn_hostname(bio, "hostname:port");//Correct hostname and port is used
    if(BIO_do_connect(bio) <= 0)
    {
        cout << "success";
    }
    BIO_get_ssl(bio, & ssl);
    X509 *x509 = NULL;
    x509 = SSL_get_certificate( ssl );//Crashing point
    return 1;
}

中的应用程序崩溃

x509=SSL_get_certificate(SSL);

知道它为什么会崩溃吗?

从手册页报价:

BIO_do_connect()尝试连接提供的BIO。如果连接成功,则返回1。如果无法建立连接,则返回零值或负值,。。。

但是,您的代码会检查零值或负值,然后错误地打印"success"并继续。因此,BIO_get_ssl(bio, & ssl);很可能会失败,并使ssl指向NULL,从而导致下一行崩溃。