C++ SSL\u连接和SSL\u错误\u系统调用

C++ SSL\u连接和SSL\u错误\u系统调用,c++,ubuntu,openssl,C++,Ubuntu,Openssl,SSL\u connect()是否支持SSL v3? 我这样问的原因是,在访问网站时: https://secure53.onlineaccess1.com 当我使用SSLv23\u方法()启动连接时,我得到了SSL\u connect(SSL)的返回值。但我最好的猜测是服务器不理解sslv2。由于此方法将发送SSLv2客户端hello消息,并指示它也理解SSLv3和TLSv1,因此服务器不理解我想要的内容,并使用EOF关闭了连接 因此,我尝试使用SSLv3\u method()连接到该服务器

SSL\u connect()
是否支持SSL v3? 我这样问的原因是,在访问网站时:

https://secure53.onlineaccess1.com

当我使用
SSLv23\u方法()
启动连接时,我得到了
SSL\u connect(SSL)
的返回值。但我最好的猜测是服务器不理解sslv2。由于此方法
将发送SSLv2客户端hello消息,并指示它也理解SSLv3和TLSv1
,因此服务器不理解我想要的内容,并使用
EOF
关闭了连接


因此,我尝试使用
SSLv3\u method()
连接到该服务器,它成功了。因此,我现在所做的是尝试连接
SSLv23\u method()
,如果
SSL\u ERROR\u SYSCALL
SSL\u get\u ERROR()
ERR\u get\u ERROR()
0
失败,我只需重置连接,然后使用
SSLv3\u method()
重新开始。我知道这不是最好的办法。但它是有效的。

如手册页所示:

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

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

不。它说在这种情况下,您应该咨询
ret
(我的重点):

SSL\u错误\u系统调用

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

ret
已传递到
SSL\u get\u error()
因此
ret
是原始
SSL\u connect()调用的返回代码。您声明,截至今天(2015年5月),您获得了一个返回值,该站点仅支持TLS 1.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);