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
有没有办法解决这个错误?
答案 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_SYSCALL
为SSL_get_error()
而0
为ERR_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