我有一个框架应用程序,它根据使用方式连接到不同的服务器。对于 https 连接,使用 openssl。我的问题是,我需要知道我连接的服务器是否使用 SSL 还是 TLS,以便我可以创建正确的 SSL 上下文。目前,如果我使用错误的上下文尝试建立连接就会超时。
对于 TLS,我使用:
SSL_CTX *sslContext = SSL_CTX_new(TLSv1_client_method());
对于 SSL 我使用:
SSL_CTX *sslContext = SSL_CTX_new(SSLv23_client_method());
那么有没有办法在建立连接之前知道服务器正在运行哪种协议呢?
编辑:据我现在的理解,它应该以任何方式工作,因为SSLv23_client_method()
还包含 TLS 协议。那么问题是为什么不呢?一种客户端方法超时而另一种客户端方法不超时的原因可能是什么?
For SSL I use:
SSL_CTX *sslContext = SSL_CTX_new(SSLv23_client_method());
TLS 只是以前的 SSL 协议的当前名称,即 TLS1.0 实际上是 SSL3.1 等。SSLv23_client_method
实际上是建立 SSL/TLS 连接的最兼容的方式,并且将使用可用的最佳协议。这意味着如果服务器支持,它还将创建 TLS1.2 连接。另请参见SSL_CTX_new 的文档 https://www.openssl.org/docs/ssl/SSL_CTX_new.html:
SSLv23_method(void)、SSLv23_server_method(void)、SSLv23_client_method(void)
使用这些方法建立的 TLS/SSL 连接可以理解 SSLv2、SSLv3、TLSv1、TLSv1.1 和 TLSv1.2 协议。
...客户端将发送包含扩展的 TLSv1 客户端问候消息,并指示它也理解 TLSv1.1、TLSv1.2 并允许回退到 SSLv3。服务器将支持 SSLv3、TLSv1、TLSv1.1 和 TLSv1.2 协议。当考虑兼容性时,这是最佳选择。
您可以禁用任何您不需要的协议(例如 SSL3.0)SSL_OP_NO_SSLv3
等并使用SSL_CTX_set_options
.
目前,如果我使用错误的上下文尝试建立连接就会超时。
那么服务器或您的代码就会被破坏。如果服务器获得与其不理解的协议的连接,则应返回“未知协议”警报。其他服务器只是关闭连接。超时通常只会发生在服务器或中间盒损坏的情况下,例如旧的服务器或中间盒F5大IP负载均衡器 https://code.google.com/p/chromium/issues/detail?id=303398.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)