检测SNI(服务器名称指示)在JavaScript的浏览器支持(Detecting SNI (Ser

2019-06-26 14:22发布

我希望能够浏览器是否支持检测SNI -服务器名称指示 。 我希望为不符合客户端重定向到一个不同的地址。

我想加载通过SSL一些内容,并确保它被安全地转移。 否则,浏览器不支持SNI。 可以这样做?

Answer 1:

你可以设置支持SNI,服务两个主机名,你在哪里需要SNI这是一个备用解决方案的服务器,一个,两个服务,他们正在主持的名称。

沿着线的东西:

  • https://www.example.com/name返回表示说I'm www.example.com
  • https://www.example.net/name返回I'm www.example.net (和需要SNI)。

如果你做一个XHR请求https://www.example.net/name并返回www.example.com ,然后在浏览器不支持SNI。



Answer 2:

不知道这是什么希望,但是有这个

  RewriteEngine on

  # Test if SNI will work and if not redirect to too old browser page
  RewriteCond %{HTTPS} on
  RewriteCond %{SSL:SSL_TLS_SNI} =""
  RewriteRule ^ http://www.example.com/too-old-browser [L,R=307]

如果旧的浏览器试图使用需要SNI然后它会被重定向网站(在这种情况下,回HTTP和网页浏览器的说法太旧)。 但你总是会得到一个错误。 这是无法避免的。 浏览器打招呼IP ...,和Apache回答你好这里是我的证件。 如果浏览器不问候的Apache提供SNI只是将默认值(即错误)证书。 浏览器则抱怨。

如果你想换到https之前从http拿起这件事,那么你可以把这样的事情在htaccess的

  #Set $_SERVER['SSL_TLS_SNI'] for php = %{SSL:SSL_TLS_SNI} or value
  SetEnv SSL_TLS_SNI %{SSL:SSL_TLS_SNI}

然后在你的页面做一个HTTPS获取从默认域(默认设置,以便浏览器不说有一个安全错误)。 如果SNI是在PHP $ _ SERVER [“SSL_TLS_SNI”]工作将有域名,否则将有%{SSL:SSL_TLS_SNI}。 这段代码可以改进,但你的想法。



Answer 3:

您只能测试之前需要它SNI支持。 也就是说,你不能强迫用户到SNI HTTPS,然后回退,如果他们不支持它,因为他们将获得(在Windows XP上的Chrome)这样的错误没有办法进行。

所以(不幸)的用户实际开始通过不安全的HTTP连接,然后只有当他们支持SNI进行升级。

您可以通过检测SNI支持:

  1. 远程脚本
    从普通HTTP页面,加载<script>从您的目的地SNI HTTPS服务器,如果脚本加载和运行正常,你知道浏览器支持SNI。

  2. 跨域Ajax(CORS)
    类似于选项1,您可以尝试执行从HTTP网页到HTTPS跨域AJAX请求,但是要知道,CORS还仅限于浏览器的支持 。

  3. 嗅探用户代理
    这可能是最可靠的方法,您将需要有知不支持它的浏览器(和操作系统)的黑名单,或已知的系统是做的白名单之间作出选择。

    我们知道,在Windows XP和IE下,Chrome和歌剧的所有版本不支持SNI。 见CanIUse.com为支持的浏览器的完整列表 。



Answer 4:

由于commercerack升级到SNI的所有网站,我们已经有同样的问题。 (用户开始结账,并得到一个讨厌的SSL问题)。

随意使用这个为出发点。 由于浏览器列表中成长,我会更新,但它确实IE在XP + Android的2.0-2.2现在。

https://github.com/brianhorakh/html-sni-useragent-sniffer-warning



文章来源: Detecting SNI (Server Name Indication) browser support in javascript