2

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 错误(对于 Unix 系统上的套接字 I/O,请参阅 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

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

4

3 回答 3

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_SYSCALLforSSL_get_error()0for失败ERR_get_error(),我只是重置连接并重新开始SSLv3_method()。我知道,这不是最好的方法。但它有效。

于 2013-03-21T07:49:50.007 回答
2

如手册页中所示:

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

于 2014-06-16T16:34:45.477 回答
1

并且由于 ERR_get_error() 返回 0,这意味着观察到了违反协议的 EOF。

不,它说在这种情况下你应该咨询ret(强调我的):

SSL_ERROR_SYSCALL

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

ret被传递给你原始调用的返回码也是SSL_get_error()如此。您说您从. 如果它是 -1 并且您在 unix 系统上,您应该咨询以了解发生了什么(强调我的):retSSL_connect()SSL_connect()errno

SSL_ERROR_SYSCALL

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

于 2015-05-02T15:01:08.620 回答