c++ - Boost 的 ASIO + SSL 在某些情况下不起作用

标签 c++ openssl boost-asio

有一个使用 Boost 的 ASIO (Boost v.1.48) + OpenSSL (v.1.0.0d) 编写的客户端/服务器应用程序。完整的 OpenSSL(动态/静态库和二进制文件)是定制构建的,构建后测试正确通过,并且静态链接到客户端和服务器。 ASIO 代码以异步模式工作。所有 ASIO 的 SSL 上下文都使用

boost::asio::ssl::context::sslv23
方法。问题描述如下。

配置0

服务器:在Win7 Prof SP1(Comp0)下工作。它使用由上述自定义构建的 OpenSSL 二进制文件生成的自签名私钥 (PK0) 和公共(public)证书 (PC0)。服务器有无限超时。 客户端:在 WinXP Prof SP3 (Comp1) 下工作。它使用服务器公共(public)证书 (PC0)。客户端有 20 秒超时。

客户端成功连接到服务器,但在 SSL 握手方法 (boost::asio::ssl::stream::async_handshake) 中的 20 秒超时后关闭连接。 失败

配置1

服务器和客户端都运行在同一个 Win7 Prof SP1 (Comp0) 上,使用与配置 0 中相同的以太网接口(interface)和相同的 PK0/PC0。

客户端成功连接握手、发送/接收数据并关闭连接。 成功

配置2

服务器:在Win7 Prof SP1(Comp0)下运行。它使用自定义构建的 OpenSSL 二进制文件生成的自签名私钥 (PK1) 和公共(public)证书 (PC1),但 PK1 和 PC1 是半年前生成的。 PK0/PC0 今天生成。所有 key 均由相同的 OpenSSL 二进制文件 (v.1.0.0d) 生成。 客户端:在 WinXP Prof SP3 (Comp1) 下工作。它使用服务器公共(public)证书 (PC1)。

客户端成功连接握手、发送/接收数据并关闭连接。 成功

配置3

服务器和客户端都运行在同一个 Win7 Prof SP1 (Comp0) 上,使用与配置 2 相同的以太网接口(interface)和相同的 PK1/PC1。

客户端成功连接握手、发送/接收数据并关闭连接。显然成功

将 OpenSSL 版本更改为最新的稳定版本 (v.1.0.0g) 会得到相同的结果。

问题是配置 0 不起作用。有人遇到过这样的问题吗?有什么想法可能是问题原因吗?需要朝哪个方向移动才能解决问题?

更新#1。使用 tlsv1 方法而不是 sslv23 方法编译的代码在配置 0 中也不起作用。

最终更新。问题已解决。原因是 Comp1 的系统日期是过去的,即该计算机的 PK0/PC0 是 future 发布的,并且 OpenSSL 在握手过程中失败。 PC1 过去是针对 Comp1 发布的,并且可以毫无问题地与它配合使用。为了诊断问题原因,我使用了在客户端计算机上执行的以下命令:

openssl s_client -connect server_ip:server_port
,其中server_ip是服务器地址,server_port是服务器监听端口。现在的任务是找到握手超时的原因而不是返回错误。但这是另一个故事了。我希望我的帖子对将来的人有所帮助。

最佳答案

问题已解决。原因是 Comp1 的系统日期是过去的,即该计算机的 PK0/PC0 是 future 发布的,并且 OpenSSL 在握手过程中失败。 PC1 过去是针对 Comp1 发布的,并且可以毫无问题地与它配合使用。为了诊断问题原因,我使用了在客户端计算机上执行的以下命令:

openssl s_client -connect server_ip:server_port
,其中server_ip是服务器地址,server_port是服务器监听端口。现在的任务是找到握手超时的原因而不是返回错误。但这是另一个故事了。我希望我的帖子对将来的人有所帮助。

关于c++ - Boost 的 ASIO + SSL 在某些情况下不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9411506/

相关文章:

c++ - 静态库 LNK2019 中的 _tWinMain

c# - TypeInitializationException 使用 OpenSsl.net

openssl - 使用 OpenSSL 生成公共(public) ed25519 key

c++ - 使用 Boost Asio 套接字为双端队列调用移动构造函数时出现问题

c++ - 对 udp::socket::async_receive_from 的多个并行调用 - 未定义的行为?

c++ - 二分法搜索的终点

c++ - Cocos2d-x box2d applyforce方向

c++ - 迭代两个 vector 迭代器比 boost_foreach 更快

c++ - 模仿 socket.h (C++) 的 OpenSSL 包装器

sockets - Boost asio套接字: how to get your own IP,端口地址?