检测浏览器 TLS 兼容性

Posted

技术标签:

【中文标题】检测浏览器 TLS 兼容性【英文标题】:Detect browser TLS compatibility 【发布时间】:2015-09-08 14:39:14 【问题描述】:

我们有一个 SSL 网站,该网站的主机最近禁用了较旧的 SSL 协议,例如 TLS 1.0 及更低版本。根据浏览器的不同,如果网站访问者使用的浏览器至少不支持 TLS 1.1,则他们在访问该网站时会收到一个空白页面或一条神秘的错误消息。

我希望创建一个不在 SSL 端口上的登录页面,并且如果它支持 TLS 1.1 及更高版本,我可以在其中检测浏览器功能。如果没有,那么我想向他们显示一条友好的消息,以升级他们的浏览器或使用其他浏览器。

这是可以使用客户端 javascript 库完成的吗?如果是这样,那我应该使用什么?

谢谢。

【问题讨论】:

我不认为你可以直接用 JS 检测到它,但你可以尝试使用 ajax 到使用不同协议的服务器的不同页面。 那么,您如何告知老浏览器用户网站不再支持他们的浏览器? 这很简单:只需在文档中插入一些html,或者生成一些alert,或类似的东西。困难的部分是检测 TLS 支持。 这就是我要问的。如何检测 TLS 版本支持。 【参考方案1】:

小笔记;除了代码,我认为人们应该知道,如果您向最终用户显示有关此的错误消息,您应该了解 TLS 版本不仅是浏览器限制,而且本质上是操作系统级别。您必须在您的机器上启用它并且您的浏览器必须支持它。您可以使用最新的 chrome,但如果在 Internet 设置中(在 Windows 上)它已被禁用,您仍然会遇到 TLS 协商问题。

【讨论】:

【参考方案2】:

这是一种方法 用 jQuery 创建一个图像,并添加一个 src 属性,我使用 PayPal 的按钮,现在所有对 PayPal 的请求都必须通过 TSL1.2 希望这可以工作

jQuery('<img />').on(
    load: function() 
      console.log("support TSL1.2");
    ,
    error: function() 
      console.log('no support TSL1.2');
    
).attr('src','https://www.paypal.com/en_US/i/btn/btn_xpressCheckout.gif');

【讨论】:

不错的把戏,谢谢。没有外部库,我们可以询问我们自己的服务器,而不是询问一个外部服务器,以了解浏览器是否允许在服务器所需的 TLS 版本内访问它。 因使用框架回答 JavaScript 问题而投了反对票。【参考方案3】:

确实,您无法检查 TLS 版本。我必须从仅支持 TLS 1.2(而不是我的页面)的站点加载脚本。使用简单的 HTML 脚本标记不会给您任何关于脚本未加载的线索。结果,我最终使用以下脚本从不同的域加载 JS:

$.ajaxSetup('cache':true);
$.getScript('scriptUrl').done(function()
   alert("done");
).fail(function( jqxhr, settings, exception ) 
    alert(jqxhr.status);
    alert(jqxhr.responseText);
    alert(exception);
);

 

如果出现 TLS 问题,jqxhr.status 将为 404,因此您可以向用户显示一条消息。

【讨论】:

【参考方案4】:

您可以使用How's my SSL?提供的the API。

在以下示例中,我检查了tls_version。检查given_cipher_suites 也可能是个好主意。

<script>
window.parseTLSinfo = function(data) 
  var version = data.tls_version.split(' ');
  console.log(
    version[0] != 'TLS' || version[1] < 1.2
    ? 'So bad! Your browser only supports ' + data.tls_version + '. Please upgrade to a browser with TLS 1.2 support.'
    : 'All OK. Your browser supports ' + data.tls_version + '.'
  );
  console.log(data);
;
</script>
<script src="https://www.howsmyssl.com/a/check?callback=parseTLSinfo"></script>

【讨论】:

正是我要找的东西!非常感谢! 一个遗憾的是它不是我可以在本地下载的js库。我不知道他为我们保留 API 多久。 @Aamir "How's My SSL" 是开源软件,可以在 GitHub 上找到。 如果客户端浏览器上完全禁用了 TLS,您将如何调用此 API?它使用安全连接,因此如果禁用 TLS,则不会发送任何请求来触发回调。 @Oriol 例如,如果您在 Windows 7 上运行 IE 8,则默认情况下将禁用 TLS 1.1 和 1.2。是的,MS 选择默认禁用它...【参考方案5】:

至少有两个网站会为您检查浏览器功能,包括 SSL Labs (https://www.ssllabs.com/ssltest/viewMyClient.html) 和 HowsMySSL (https://www.howsmyssl.com/)。 HowsMySSL 还有一个很好的 API,可以很容易地从 JavaScript 中检查。

【讨论】:

请注意,HowsMySSL 已开始收取订阅费用。 +1 - ssllabs.com/ssltest/viewMyClient.html 实际上显示了所有可以协商的 TLS 版本,这正是我所寻找的。​​span>

以上是关于检测浏览器 TLS 兼容性的主要内容,如果未能解决你的问题,请参考以下文章

IE高级设置里的使用TLS1.0,SSL2.0,SSL3.0是啥意思

win10 TLS安全设置未设置该怎么办

检测浏览器文件兼容性

JavaScript-浏览器兼容之客户端检测

浏览器插件安装过程中出现 GTP 6浏览器兼容检测

浏览器的兼容大坑