以下命令打印所提及主机的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);
任何想法为什么会崩溃?
答案 0 :(得分:1)
从联机帮助页面引用:
BIO_do_connect()尝试连接提供的BIO。如果连接成功建立,则返回1。如果无法建立连接,则返回零或负值,...
但是,您的代码会检查零值或负值,然后错误地打印“成功”并继续。因此,BIO_get_ssl(bio, & ssl);
很可能会失败并使ssl
指向NULL
,从而导致下一行崩溃。
答案 1 :(得分:0)
Obtaining ssl certificate on windows using C++
这与我遇到的问题相同,并且在接受的答案中清楚地给出了解决方案。