使用SSL_get_certificate()时OpenSSL API崩溃

时间:2014-09-04 09:17:54

标签: c++ ssl openssl

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

  

openssl s_client -connect hostname:port | openssl x509 -fingerprint -noout

要使用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);

任何想法为什么会崩溃?

2 个答案:

答案 0 :(得分:1)

从联机帮助页面引用:

  

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

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

答案 1 :(得分:0)

Obtaining ssl certificate on windows using C++

这与我遇到的问题相同,并且在接受的答案中清楚地给出了解决方案。