2
我已经使用OpenSSL(在Ubuntu 12.04上用C++编写)编写了一个SOAP客户端,但它目前工作时未检查服务器安全证书。这是我用来建立连接,并检查证书未能通过OpenSSL验证服务器证书
bool bInitialiseSSL(SSL_CTX* &ctx, SSL* &ssl, BIO* &bio)
{
ctx = SSL_CTX_new(SSLv23_client_method());
bio = BIO_new_ssl_connect(ctx);
if (bio == NULL) {
ERR_print_errors_fp(stderr);
SSL_CTX_free(ctx);
return false;
}
BIO_get_ssl(bio, &ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
char target[] = "api.betfair.com:https";
BIO_set_conn_hostname(bio, target);
BIO_set_nbio(bio,1);
while (1) {
if (BIO_do_connect(bio) <= 0) {
if (!BIO_should_retry(bio)) {
cout << "Connect failed." << endl;
BIO_free_all(bio);
SSL_CTX_free(ctx);
return false;
}
} else {
break;
}
}
if (BIO_do_handshake(bio) <= 0) {
BIO_free_all(bio);
SSL_CTX_free(ctx);
return false;
}
X509 *cert;
bool bValid = false;
cert = SSL_get_peer_certificate(ssl);
if (cert != NULL) {
long res = SSL_get_verify_result(ssl);
if (res == X509_V_OK) {
bValid = true;
} else {
cout << "Error in security validation: " << res << endl;
}
X509_free(cert);
}
return bValid;
}
这工作得很好,但SSL_get_verify_result的返回值是20,它对应于
X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY功能:无法获取本地 发行人证书
我看了一些OpenSSL的文档的功能,但它是不是特别人性化。我看了一些网络教程,我看不到我做错了什么。在我尝试实施证书检查之前,我的软件完美工作,但我看不到我需要做什么。我需要在我的机器上配置设置吗?服务器是betfair,据说非常安全,我很难相信他们没有有效的SSL证书。如果有人能告诉我我做错了什么,我会非常感激。
感谢您的回答 - 我如何发现它是私人或公共证书? – mathematician1975
如果它是外部服务器,则应尝试第一种替代方法。 –
如果您使用的是客户端证书,'SSL_CTX_use_PrivateKey_file'用于将您的私钥作为客户端。这与拥有“私人”证书毫无关系(在这种情况下,这没有任何意义)。如果您的单独CA不在默认的Mozilla列表中(或您选择使用的列表),请将其添加到主CA列表中。 – Bruno