以下命令将打印出所提及主机的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/