以下命令将打印出所提及主机的SHA1指纹


  openssl s_client -connect主机名:端口| openssl x509-指纹-无


为了使用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。如果无法建立连接,则返回零或负值,...


但是,您的代码检查是否为零或负值,然后错误地打印“成功”并继续。结果,BIO_get_ssl(bio, & ssl);最有可能失败,并使ssl指向NULL,导致下一行崩溃。

关于c++ - 使用SSL_get_certificate()时OpenSSL API崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25661643/

10-12 22:04