无法使用OpenSSL验证服务器证书
Failing to validate server certificate with OpenSSL
我已经使用OpenSSL编写了一个SOAP客户端(在Ubuntu 12.04上用C++编写),但它目前可以在不检查服务器安全证书的情况下工作。这是我用来设置连接和检查证书的功能
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功能的文档,但它对用户不是特别友好。我看了很多网络教程,看不出我做错了什么。在我尝试实现证书检查之前,我的软件运行得很好,但我看不到我需要做什么。我需要在机器上配置设置吗?服务器很安全,我很难相信他们没有有效的SSL证书。如果有人能告诉我我做错了什么,我将不胜感激。
这取决于服务器的证书。
- 如果是公共有效证书,则可以将CA证书文件包含在SSL_CTX中
代码:
ctx = SSL_CTX_new(SSLv23_client_method());
// You can load CA certs into SSL_CTX
SSL_CTX_load_verify_locations(ctx, cafile, NULL); // cafile: CA PEM certs file
您可以从cURL网站CA certs从mozilla.org 下载公共CA证书文件
- 如果它是私有证书,并且您有证书文件,则可以使用
SSL_CTX_use_certificate_file
而不是SSL_CTX_load_verify_locations
相关文章:
- 如何使用GSOAP初始化服务器上下文以启用简单身份验证(仅服务器身份验证)
- 如何在服务器端验证用户请求(在我的特定情况下)
- 证书验证在客户端服务器通信中使用boost :: asio和openssl失败
- 无法使用OpenSSL验证服务器证书
- 未经身份验证的SMTP服务器到服务器通信
- 使用套接字的C++中的客户端到服务器身份验证
- 客户端身份验证或与Mongoose Web服务器的相互身份验证
- 如何验证是否已在 SQL 服务器中删除行
- 停止服务器>如何验证线程是否已停止 ->pthread
- 验证进程外的COM服务器客户端是否受信任
- 是否使用LDAP+kerberos作为身份验证程序启用SASL(带有GSSAPI)的客户端和服务器?(单点登录SSO系统
- 客户端和身份验证服务器
- OpenSSL:服务器无法验证客户端证书
- 验证SSL_get_peer_certificate返回的服务器证书的客户端程序
- 客户端/服务器应用程序的身份验证策略
- POCO HTTPS请求验证服务器证书
- 服务器证书验证失败.CAfile: ca.pem CRLfile:无
- 基于epoll的服务器失败(相互身份验证)
- 对服务器/客户端应用程序使用Kerberos身份验证
- 如何向 socks5 代理服务器添加身份验证