openSSL示例上的SSL Accept错误

时间:2012-12-13 08:26:56

标签: c ssl openssl ssl-certificate

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

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

我看到this发布并从接受的答案中复制了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 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.

这有帮助吗? 再次感谢!

2 个答案:

答案 0 :(得分:1)

由于错误代码为SSL_ERROR_SYSCALL且r为零,客户端确实正常关闭了底层TCP连接(通过调用close()shutdown())。

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

编辑:根据问题的第2版:

证书存在一些问题。

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

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

或者您也可以从客户端代码中删除常用名称检查。 您可能从示例中获得以下代码:

if(require_server_auth)
  check_cert(ssl,host);

评论或设置require_server_auth=0。然后再试一次。

答案 1 :(得分:0)

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

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

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