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

时间:2014-07-22 19:57:20

标签: ssl https

我想向浏览器的最高加密级别为SSLv3的客户显示一条消息。我可以定位SSLv3的浏览器设置并降低吗?客户端或服务器代码?我们将允许较低版本的SSL在特定宽限期内使用我们的网站。在此宽限期内,我们仅向浏览器设置为SSL3或更低版本的用户显示消息。

3 个答案:

答案 0 :(得分:0)

不容易。在SSL握手进行之前,浏览器支持的SSL版本是不可检测的,即使这样,浏览器也会使用SSLv2握手来允许动态版本协商。如果检测到不受支持的版本,则由于握手失败并且在您发送任何消息之前连接将关闭,您将无法发回消息。但是,SSL本身有一个在握手期间发送的错误数据包,它可以指定版本不匹配错误。

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

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

答案 1 :(得分: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).

Appendix E当然值得一看。

Client Hello消息还将包含客户端支持的密码套件列表,这可能与您的问题的一般概念相关。)

当然,这个规范只是一个“应该”,所以支持TLS 1.2的客户端仍然可以为TLS 1.1发送Client Hello,但重点是什么?通过这样做,无论如何都没有机会使用TLS 1.2。它可能是一个关闭的首选项框,但这将有效地使它成为一个不支持最高版本的客户端。 (如果您需要更精细的内容,则需要构建一个已知用户代理的数据库,这将部分不可靠,并且您需要分析完整的用户代理字符串以了解有关该平台的所有可能信息。)

现在,如何将Client Hello消息的内容传达给您的应用程序是另一回事,并且很大程度上取决于您使用的SSL / TLS堆栈。如果不修改SSL / TLS库或您正在使用的服务器,甚至可能无法直接实现。

话虽如此,您通常可以很容易地在当前会话期间获得协商的TLS版本。由于该版本是"lower of that suggested by the client in the client hello and the highest supported by the server"(即“min(max(client), max(server))”)。如果您的服务器支持SSLv3,TLS 1.0,TLS 1.1和TLS 1.2,并且由于最新版本是TLS 1.2,您在当前连接期间获得的内容也将是客户端当前支持的最大值。只要您的服务器支持最新版本,您就应该能够从任何实时连接中了解客户端最多支持的内容。

如果您落后于Apache HTTP server's mod_ssl,您应该可以从SSL_PROTOCOL环境变量中获取该值。您还应该能够从Java中的SSLSession获取协议。

(如果您愿意撰写更多定制服务,您可以更直接地将密码套件等详细信息传递给您的应用程序,例如this service from Qualys SSL Labs does,尽管我不确定它是否可以广泛使用或者只是一个测试服务。)

答案 2 :(得分:-2)

我不得不同意雷米的观点,认为它有点挑战性。

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

类似的东西:

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

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

javax.net.ssl.cipher_suite

我希望这(至少)让你更接近。

祝你好运。