SSL_connect和SSL_ERROR_SYSCALL

时间:2013-03-20 13:45:36

标签: c++ ubuntu openssl

SSL_connect()是否支持ssl v3? 我问这个的原因是,在访问网站时:

https://secure53.onlineaccess1.com

我得到SSL_connect(ssl)的返回值为< 0,SSL_get_error()为5,ERR_get_error()为0.所以最终的结果是我发现SSL_get_error()是5 ,

  

SSL_ERROR_SYSCALL

     

发生了一些I / O错误。 OpenSSL错误队列可能包含有关错误的更多信息。如果错误队列为空(即   ERR_get_error()返回0),ret可以用来查找更多关于   错误:如果ret == 0,则观察到违反协议的EOF。如果   ret == -1,底层BIO报告了I / O错误(对于socket I / O on   Unix系统,详情请咨询errno。

由于ERR_get_error()返回0,it means an EOF was observed that violates the protocol.

但这是否意味着它不支持sslv3?

我使用curl在命令行中尝试了url,我不得不强迫v3让它像这样工作:

curl -3 -v https://secure53.onlineaccess1.com

有没有办法解决这个错误?

2 个答案:

答案 0 :(得分:3)

我正在使用SSLv23_method()来启动连接。但我最好的猜测是服务器并不了解sslv2。由于此方法will send out SSLv2 client hello messages and will indicate that it also understands SSLv3 and TLSv1,服务器无法理解我想要的内容并使用EOF关闭了连接。

所以我尝试使用SSLv3_method()连接到此服务器并且它有效。所以我现在正在尝试与SSLv23_method()联系,如果它失败,SSL_ERROR_SYSCALLSSL_get_error()0ERR_get_error(),我只是重置连接并使用SSLv3_method()重新开始。我知道,这不是最好的方式。但它确实有效。

答案 1 :(得分:1)

如手册页中所示:

SSLv23_method(void), SSLv23_server_method(void), SSLv23_client_method(void)

A TLS/SSL connection established with these methods will understand the SSLv2, SSLv3, and TLSv1
protocol. 
A client will send out SSLv2 client hello messages and will indicate that it also understands     
SSLv3 and TLSv1. 
A server will understand SSLv2, SSLv3, and TLSv1 client hello messages. 
This is the best choice when compatibility is a concern.

因此,根据您使用的openSSL版本, 当使用 SSLv23_client_method()时,客户端将尝试协商他可以与服务器共同找到的最高协议层。

您的服务器更可能不支持TLSv1.0或更高版本。 我会尝试以下方法:

SSL_CTX *sslCTX = SSL_CTX_new(SSLv23_client_method());
SSL_CTX_set_options(sslCTX, SSL_OP_ALL | SSL_OP_NO_TLSv1_2 | SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1);

有效地尝试与SSLv3协商并可能回退到SSLv2