我正在尝试运行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.
这有帮助吗? 再次感谢!
答案 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)来帮助您进行调试?