0

我正在尝试运行 openSSL 示例(从此处下载的源代码)。我已经设法构建它并在端口 4433 上运行“wserver”示例(使用 VirtualBox 在 Ubuntu 12.10 虚拟机上运行)

然后我尝试从 Windows 8 启动客户端,但我一直SSL accept error在服务器终端上显示节目。

我看到了这篇文章并从接受的答案中复制了 bash 脚本,使用它,我设法创建了一个新的 root.pem 和其他证书,但我仍然遇到同样的错误

(不知道是否重要,我正在使用端口 4433,因为 VM 由于某种原因无法绑定到 443,是的,我也在客户端上更改了它)

此外,服务器是用 C 编写的。

有任何想法吗?谢谢!

编辑

我发现错误发生在这一行

r=SSL_accept(ssl);

我检查了返回到 r 的错误使用

SSL_get_error(ssl,r);

它似乎是SSL_ERROR_SYSCALL

我检查了一下ERR_get_error();,它返回了0 意义

如果 ret == 0,则观察到违反协议的 EOF

还不知道是什么意思。。

编辑 2

我检查了客户端返回代码,12045 根据 MSDN,这是错误的

ERROR_INTERNET_INVALID_CA

12045

该功能不熟悉生成服务器证书的证书颁发机构。

但是当使用虚拟机提供的客户端时,连接很好,没有证书问题

Microsoft here12045所示的覆盖会导致错误,即12038

ERROR_INTERNET_SEC_CERT_CN_INVALID

           SSL certificate common name (host name field) is incorrect.
           For example, if you entered www.server.com and the common
           name on the certificate says www.different.com.

这有帮助吗?再次感谢!

4

2 回答 2

1

因为错误代码是 SSL_ERROR_SYSCALL 并且r为零,所以客户端确实关闭了底层 TCP 连接(通过调用close()or shutdown())。

您应该从客户端代码中查看可能导致 TCP 连接关闭的原因。

编辑:根据问题的edit2:

证书有一些问题。

我建议在测试期间使用自签名证书以避免证书链出现问题。当一切正常时,然后开始使用更复杂的证书。

因为你得到ERROR_INTERNET_SEC_CERT_CN_INVALID了 ,所以证书中可能有错误的 common nane (CN)。检查Subject:证书字段。题目中有CN=xxxxx。xxxxx 必须与主机的 IP/主机名相同。

或者,您也可以从客户端代码中删除公用名检查。您可能有示例中的以下代码:

if(require_server_auth)
  check_cert(ssl,host);

将其注释掉或设置require_server_auth=0。然后再试一次。

于 2012-12-13T09:43:08.793 回答
0

这可能意味着在 SSL 握手的 Accept 阶段发生了错误。

另外,我认为 openSSL 有一个详细的选项。-v 我认为。

您是否使用数据包嗅探器(Wireshark、Ethereal)来帮助您进行调试?

于 2012-12-13T08:54:08.487 回答