使用openssl检查服务器安全协议

时间:2014-12-03 17:41:12

标签: c++ ssl openssl

我有一个框架应用程序,它根据使用方式连接到不同的服务器。对于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协议。所以问题是为什么不呢?使用一种客户端方法而不是另一种客户端方法超时的原因是什么?

2 个答案:

答案 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.2,使用后备信令检测降级攻击
  • 如果TLS 1.2失败,则尝试使用TLS 1.1,使用后备信令检测降级攻击
  • 如果TLS 1.1失败,则尝试使用TLS 1.0,使用后备信令检测降级攻击

很多人在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就没有履行其使命。