我有一个框架应用程序,它根据使用方式连接到不同的服务器。对于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协议。所以问题是为什么不呢?使用一种客户端方法而不是另一种客户端方法超时的原因是什么?
答案 0 :(得分:3)
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连接。另见documentation of SSL_CTX_new:
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 Big IP load balancer这样的中间件上。
答案 1 :(得分:1)
在建立连接之前,有没有办法知道服务器正在运行哪个协议?
没有。但是你现在应该假设它的" TLS 1.0及以上"。
正如Steffen指出的那样,您使用SSLv23_method
和上下文选项来实现" TLS 1.0及以上"。这是完整的代码。您可以在客户端或服务器中使用它:
const SSL_METHOD* method = SSLv23_method();
if(method == NULL) handleFailure();
SSL_CTX* ctx = SSL_CTX_new(method);
if(ctx == NULL) handleFailure();
const long flags = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION;
SSL_CTX_set_options(ctx, flags);
现在,这里隐含的假设并不明显;而这种假设是错误的。这个假设是有一个" TLS min"和" TLS max"版本
会发生什么是基础SSL / TLS记录层,其中包含协议有效负载。 TLS记录层独立于协议层,它有自己的版本。人们将TLS记录层版本解释为" TLS min"版;和协议版本为" TLS max"版。大多数客户端服务器,站点和服务都以这种方式使用它。
但是,IETF没有这样指定,浏览器也没有这样使用它。因此,我们最近获得了TLS Fallback Signaling Cipher Suite Value (SCSV)。
浏览器是正确的。以下是它应该如何完成的事情:
很多人在TLS 1.0失败后放弃了。某些用户代理可以继续使用SSLv3。
为什么IETF没有移动给我们" TLS min"和" TLS max"?这仍然是一个谜。我认为给出的有效论据是"假设客户想要使用TLS 1.0,1.2和1.3,而不是1.1"。我不知道有谁丢弃这样的协议版本,所以它对我来说只是一个稻草人。 (当我怀疑执法或国家利益,如国家安全局是否正在篡改标准时,这是其中一次。)
最近在TLS工作组上提出了这个问题。来自TLS: prohibit <1.2 support on 1.3+ servers (but allow clients)(2015年5月21日):
现在可能是为TLS 1.3添加(3)的好时机:拥有一个客户端 指定他们愿意使用的最少TLS版本,以及 他们希望使用的最大TLS。和MAC或它从中得到它 不能被篡改或降级。
您仍然可以提供TLS记录图层版本 将它保持为非MAC,以便它可以被篡改以引起披露或 崩溃:))
实际上,这就是记录层和客户端中的版本 正在使用协议。它阻止了浏览器和那些愚蠢的舞蹈 其他用户代理执行而无需TLS后备SCSV。
如果IETF的一部分任务是记录现有的做法,那么IETF就没有履行其使命。