我希望能够浏览器是否支持检测SNI -服务器名称指示 。 我希望为不符合客户端重定向到一个不同的地址。
我想加载通过SSL一些内容,并确保它被安全地转移。 否则,浏览器不支持SNI。 可以这样做?
我希望能够浏览器是否支持检测SNI -服务器名称指示 。 我希望为不符合客户端重定向到一个不同的地址。
我想加载通过SSL一些内容,并确保它被安全地转移。 否则,浏览器不支持SNI。 可以这样做?
你可以设置支持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。
不知道这是什么希望,但是有这个
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}。 这段代码可以改进,但你的想法。
您只能测试之前需要它SNI支持。 也就是说,你不能强迫用户到SNI HTTPS,然后回退,如果他们不支持它,因为他们将获得(在Windows XP上的Chrome)这样的错误没有办法进行。
所以(不幸)的用户实际开始通过不安全的HTTP连接,然后只有当他们支持SNI进行升级。
您可以通过检测SNI支持:
远程脚本
从普通HTTP页面,加载<script>
从您的目的地SNI HTTPS服务器,如果脚本加载和运行正常,你知道浏览器支持SNI。
跨域Ajax(CORS)
类似于选项1,您可以尝试执行从HTTP网页到HTTPS跨域AJAX请求,但是要知道,CORS还仅限于浏览器的支持 。
嗅探用户代理
这可能是最可靠的方法,您将需要有知不支持它的浏览器(和操作系统)的黑名单,或已知的系统是做的白名单之间作出选择。
我们知道,在Windows XP和IE下,Chrome和歌剧的所有版本不支持SNI。 见CanIUse.com为支持的浏览器的完整列表 。
由于commercerack升级到SNI的所有网站,我们已经有同样的问题。 (用户开始结账,并得到一个讨厌的SSL问题)。
随意使用这个为出发点。 由于浏览器列表中成长,我会更新,但它确实IE在XP + Android的2.0-2.2现在。
https://github.com/brianhorakh/html-sni-useragent-sniffer-warning