我能检测浏览器支持的SSL版本吗?

3
我想向浏览器最高加密级别为 SSLv3 的客户显示一条消息。我能否针对 SSLv3 及以下的浏览器设置进行定位?需要用客户端或服务器端代码实现?在某个宽限期内,我们将允许较低版本的 SSL 使用我们的网站。在此期间,我们希望仅向那些浏览器设置为 SSL3 或更低版本的用户显示一条消息。
3个回答

0
首先,现在通常可以忘记不支持至少SSLv3的客户端。 SSLv3 已经广泛可用多年了。
当浏览器发起连接时发送的 TLS Client Hello消息应包含它支持的最高TLS版本:
   client_version
      The version of the TLS protocol by which the client wishes to
      communicate during this session.  This SHOULD be the latest
      (highest valued) version supported by the client.  For this
      version of the specification, the version will be 3.3 (see
      Appendix E for details about backward compatibility).

附录E 当然值得一看。

(客户端Hello消息还将包含客户端支持的密码套件列表,这对于您的问题的总体想法可能是相关的。)

当然,这个规范只是一个“SHOULD”,因此支持TLS 1.2的客户端仍然可以发送TLS 1.1的Client Hello消息,但这有什么意义呢?这样做根本没有机会使用TLS 1.2。它可以是一个关闭的首选项框,但那实际上使它成为不支持最高版本的客户端。(如果你想要更复杂的东西,你需要建立一个已知用户代理的数据库,这将部分不可靠,并且你需要分析完整的用户代理字符串来了解平台的所有可能性。)

现在,如何将Client Hello消息的内容传达给你的应用程序是另一回事,并且非常取决于你使用哪个SSL/TLS堆栈。甚至可能无法直接实现,除非修改该SSL/TLS库或您使用的服务器。

话虽如此,您通常可以很容易地在当前会话期间获取协商的 TLS 版本。由于该版本是客户端在客户端 hello 中建议的版本和服务器支持的最高版本的"较低版本"(即“min(max(client),max(server))”)。如果您的服务器支持 SSLv3、TLS 1.0、TLS 1.1 和 TLS 1.2,而且由于最新版本是 TLS 1.2,因此您在当前连接期间获得的也将是客户端当前支持的最大版本。只要您的服务器支持最新版本,您就应该能够从任何实时连接中了解客户端支持的最好版本。

如果您在Apache HTTP 服务器的 mod_ssl后面,您应该能够从 SSL_PROTOCOL 环境变量中获取它。您还应该能够从 Java 的 SSLSession 中获取协议。

(如果您愿意编写更定制化的服务,您可以将诸如密码套件之类的更详细信息直接传递给您的应用程序,例如Qualys SSL Labs的此服务,尽管我不确定它是否旨在广泛提供或仅作为测试服务。)


0

不容易。浏览器支持的SSL版本在SSL握手过程中才能被检测到,即使是在浏览器使用SSLv2握手进行动态版本协商时也只有这种情况。如果检测到不支持的版本,由于握手失败并且连接将在您发送任何消息之前关闭,因此您将无法发送消息回去。然而,SSL本身具有在握手期间发送的错误数据包,它可以指定版本不匹配错误。

在您自己的代码中,您可以做的最好的事情是在服务器端支持所有SSL版本,让客户端正常完成握手,然后检测实际使用的版本并在SSL版本太低时发送回一条消息。

或者,您可以仅启用TLSv1或更高版本,并拒绝让旧客户端连接。除非浏览器决定检测SSL版本不匹配错误并显示自己的漂亮消息,否则他们将不会得到一个好的错误消息。


谢谢Remy,让我澄清一下。我们将有一个宽限期,在此期间我们将允许较低版本的SSL,但在某个日期之后,我们将不再支持这些版本,他们需要升级浏览器。当然,用更加用户友好的语言表达。所以在你的第二段中,你提到了检测使用的版本。你知道有没有办法做到这一点,无论是在服务器端还是客户端代码方面? - Matt

-3

我同意Remy的看法,这有点具有挑战性。

不过,一个好的起点可能是检索一些SSL(证书)信息。

类似于这样的内容:

X509Certificate certChain[] = 
(X509Certificate[]) req.getAttribute("javax.net.ssl.peer_certificates");

获取更多信息的另一种方法是检索cipher_suite属性(类似于上面的代码片段)。

javax.net.ssl.cipher_suite

希望这能让你更接近目标。
祝好运。

2
浏览器是否呈现客户端证书(通常不会)与其支持的SSL版本无关。 - Bruno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接