【问题标题】:How to set up SSL protocols priority in OpenSSL如何在 OpenSSL 中设置 SSL 协议优先级
【发布时间】:2015-03-16 15:41:08
【问题描述】:

我正在使用 OpenSSL 实现 SSL 客户端 (1) 只“讲”TLS 1.2、TLS 1.1 和 TLS 1.0, (2) 准确设置此优先级:TLS 1.2。如果无法进行通信,请使用 TLS 1.1。如果没有,TLS 1.0。如果没有,拒绝连接。

我通过使用实现(1)

SSL_CTX_set_options(m_ssl_ctx, SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3);

但我不知道有什么方法可以实现 (2)。在 OpenSSL 中是否有任何“优雅”的方法可以做到这一点,或者我是否必须尝试多个连接来检查是否可以通信,如果不能,则尝试较低的协议版本?

谢谢。

【问题讨论】:

  • 您可以在 OpenSSL 服务器上执行此操作。 服务器决定协议。 Apache HTTPD、OpenLDAP、MySQL,在我所知道的使用 OpenSSL 的主要软件中,都可以通过它们的配置文件来管理它。 RFC 没有强制要求,但 OpenSSL 绝对允许这样做。例如,这是减轻 BEAST 攻击的方式。
  • @EJP: “例如,您如何缓解 [在服务器上] 的 BEAST 攻击...” - 标准没有指定是使用客户端的首选密码套件还是服务器的首选密码套件。习惯上允许客户端选择(由服务器选择客户端的首选)。对于您描述的行为,您需要在服务器上添加SSL_OP_CIPHER_SERVER_PREFERENCE 标志。

标签: ssl openssl


【解决方案1】:

没有协议优先级设置。客户端将向服务器宣布它可以做的最佳版本,服务器将选择这个或更低的版本。如果客户端不支持服务器选择的版本,则握手将失败。这不是 OpenSSL 特有的,而是 SSL/TLS 的工作原理。

不要将客户端和服务器之间的这种握手与大多数浏览器使用的 TLS 降级机制相混淆。在这种情况下,如果与更好版本的握手失败,浏览器会在与较低版本的新 TCP 连接上重试 SSL 握手。此行为是为了解决损坏的 SSL/TLS 实现。这些降级主要限于浏览器,更简单的 TLS 堆栈的容忍度较低,如果第一次握手失败,则会永久失败。

【讨论】:

  • 没有“TLS min”和“TLS max”版本。有记录层版本和协议版本。他们是独立的。虽然客户端和服务器最常以这种方式使用记录层/协议版本,但标准中并未以这种方式记录。因此,@ 987654321@。开放式问题:如果每个人都这样使用它,那么为什么 IETF 不对其进行记录和标准化,而不是提供另一种选择(下级服务器无论如何都不会实现)。
  • 据我了解,回退信号只是告诉服务器,客户端先前尝试使用更好的 TLS 版本的尝试没有成功,假设这是由服务器上的问题引起的(即服务器在 SSLv23 或 TLSv12 上发出嘶嘶声,而不是用正确的版本回复)或中间的某个人试图通过中断与更高协议版本的握手来降级协议。这与正常的握手过程无关,只是他们检测异常握手。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多