【问题标题】:SSL Accept error on openSSL examplesOpenSSL 示例上的 SSL Accept 错误
【发布时间】:2012-12-13 08:26:55
【问题描述】:

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

然后我尝试从 Windows 8 启动客户端,但我不断在服务器终端上显示SSL accept error

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

(不知道是否重要,我正在使用端口 4433,因为虚拟机由于某种原因无法绑定到 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 here 所示,覆盖 12045 会导致 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.

这有帮助吗? 再次感谢!

【问题讨论】:

  • 你用的是什么客户端?我建议你也看看另一边发生了什么。
  • 只是一个朋友给我检查连接的小客户端。我已经设法通过 https 获取 mail.google.com 的 index.html
  • 您可以尝试使用示例中的客户端吗?
  • 它适用于示例中的客户端(均在虚拟机中启动)@User1 r 为 0
  • 再次编辑了我的问题

标签: c ssl openssl ssl-certificate


【解决方案1】:

因为错误代码是 SSL_ERROR_SYSCALL 并且 r 为零,所以客户端确实关闭了底层 TCP 连接(通过调用 close()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。然后再试一次。

【讨论】:

  • 是的,我尝试在我的自签名证书中更改CN,但仍然不行,所以我找到了一种方法(客户端是用 WinAPI 编写的,不熟悉它)禁用 SSL 检查现在,它现在运行。感谢您的帮助!
【解决方案2】:

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

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

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

【讨论】:

  • 我对此很陌生,不太确定他们如何帮助我调试.. 编辑我的问题以添加更多信息。感谢您的回答
  • 数据包嗅探器可以帮助您进行调试,因为它允许您窥探正在发送的数据包内部。尝试运行数据包嗅探器,然后执行测试。确保在数据包嗅探器中过滤 ssl。由于服务器报告了一个ssl接受错误,我相信它会在ssl握手期间反映在服务器的回复包中。
  • 关于 EOF:您的客户端程序可能在 SSL 接受期间向服务器发送了一些不完整的数据。我还是建议你用抓包来调试。我们总是想确保我们实际上发送的是我们认为我们正在发送的数据。 =)
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 1970-01-01
  • 2019-12-12
  • 2018-12-21
  • 2014-04-27
  • 1970-01-01
相关资源
最近更新 更多