c++ - BIO_do_connect() 似乎失败是因为使用了 SSL v3,有没有办法获得更多诊断信息?

标签 c++ ssl paypal openssl

我编写了一个类来处理用于与 Paypal 通信的 SSL 连接。

它工作了大约一年,现在马上就失败了。从我得到的错误来看,这似乎是因为他们(最终)关闭了 SSLv3 密码。然而,我认为它已经在我这边关闭了。

尝试连接我的代码时出现错误:

139673112286976:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1262:SSL alert number 40

如果我尝试使用命令行工具连接 -ssl3,我会得到完全相同的错误:

openssl s_client -connect api.sandbox.paypal.com:443 -ssl3

请注意,没有 -ssl3 选项的命令行按预期工作。

我看到一些帖子说错误意味着使用的密码有问题,这让我认为这就是我遇到的问题。

对于那些感兴趣的人,整个类(class)都可以在我们的 snapcpp git 中找到。 (上一个从 snapwebsites 库中获取 .h 和其他文件)。

有相关代码。我删除了触发当前故障之前发生的错误检查:

std::shared_ptr<SSL_CTX> ssl_ctx(SSL_CTX_new(TLSv1_client_method()), ssl_ctx_deleter);
SSL_CTX_set_verify_depth(ssl_ctx.get(), 4);
SSL_CTX_set_options(ssl_ctx.get(), SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_COMPRESSION);
SSL_CTX_set_cipher_list(ssl_ctx.get(), "HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4");
SSL_CTX_load_verify_locations(ssl_ctx.get(), NULL, "/etc/ssl/certs");
std::shared_ptr<BIO> bio(BIO_new_ssl_connect(ssl_ctx.get()), bio_deleter);
SSL * ssl(nullptr);
BIO_get_ssl(bio.get(), &ssl);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
BIO_set_conn_hostname(bio.get(), const_cast<char *>(addr.c_str()));
BIO_set_conn_int_port(bio.get(), &port);
if(BIO_do_connect(bio.get()) <= 0)
{
    ERR_print_errors_fp(stderr);
    throw tcp_client_server_initialization_error("failed connecting BIO object to server");
}

所以我的类抛出异常是因为 BIO_do_connect() 得到了我之前提到的错误。但我认为这些选项:

SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1

足以避开 SSLv3。

还有什么可能是罪魁祸首?

最佳答案

您声明了 SSL_OP_NO_TLSv1 但您使用的是 TLSv1 方法。

尝试将 TLSv1_client_method() 更改为 SSLv23_client_method()。这将允许使用任何方法(实际上它将协商可用的最高 SSL/TLS 版本)。您可以像在代码中那样使用 SSL_CTX_set_options 对其进行限制。

由于某些原因,文档说 SSLv23_method() 已被弃用,应该使用 TLS_method()。但是,他们最新的(OpenSSL 1.0.2e)代码中没有这样的东西。

关于c++ - BIO_do_connect() 似乎失败是因为使用了 SSL v3,有没有办法获得更多诊断信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34913845/

相关文章:

c++ - 在 Matlab 2013a 中编译和运行 mex

c++ - 根据模板参数创建字符串

security - 了解 TLS/SSL 协议(protocol)

c++ - 使用 InterlockedCompareExchange 无锁

c++ - 用命令行编译gtkmm程序?

ssl - 如何将数字证书添加到单个镜像 Installshield 安装程序

ssl - 在没有 “www”的情况下访问时将证书添加到我的站点

php - IPN 验证失败

没有api的 Paypal 快速结帐通知网址

api - Paypal 发送发票不发送电子邮件