有一个使用 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/