usr*_*ΛΩΝ 21 ssl virtualhost sni apache-2.2
我有带有 mod_ssl 的 Apache 2.2 和一堆 HTTPS 站点,位于与 VirtualHosting 相同的 IP/端口上,因此客户端必须支持 SNI 才能连接到这些虚拟主机。
我想通过以下方式配置我的服务器:
当用户输入 www.dummysite.com 并且他的浏览器支持SNI(服务器名称指示)时,任何 HTTP 请求都会被重定向到https://发送 HSTS 标头的位置。但如果浏览器不支持SNI,则请求由 HTTP 提供。
上面的规则,按原样陈述,实际上是那些仍然运行旧浏览器的人的后备规则,因为 Mozilla 和 Chrome 没有这个问题,只是为了避免让这些用户离开网站。
我想在 Apache 配置级别执行此重定向,可能在用户代理上使用过滤器。我不想触摸正在运行的应用程序,除非确保不存在直接的 http:// 引用(否则它们意味着安全警告)
[编辑](在编辑问题时我忘记了问题):要重定向的启用 SNI 的用户代理列表是什么?
Sha*_*den 20
由于 SNI 发生在 SSL/TLS 握手期间,因此当客户端连接到 HTTP 时无法检测浏览器支持。
所以,你是对的;用户代理过滤器是执行此操作的唯一方法。
最大的问题是,您是要针对您知道不会侦听 SNI 的浏览器的黑名单采取行动,还是要对已知支持 SNI 的浏览器白名单采取行动。无法使用该网站的模糊或新设备似乎是一个交易破坏者,所以我认为白名单可能是更好的选择。
在您的 HTTP 中<VirtualHost>:
# Internet Explorer 7, 8, 9, on Vista or newer
RewriteCond %{HTTP_USER_AGENT} MSIE\s7.*Windows\sNT\s6 [OR]
RewriteCond %{HTTP_USER_AGENT} MSIE\s8.*Windows\sNT\s6 [OR]
RewriteCond %{HTTP_USER_AGENT} MSIE\s9.*Windows\sNT\s6 [OR]
# Chrome on Windows, Mac, Linux
RewriteCond %{HTTP_USER_AGENT} Windows\sNT\s6.*Chrome [OR]
RewriteCond %{HTTP_USER_AGENT} Macintosh.*Chrome [OR]
RewriteCond %{HTTP_USER_AGENT} Linux.*Chrome [OR]
# Firefox - we'll just make the assumption that all versions in the wild support:
RewriteCond %{HTTP_USER_AGENT} Gecko.*Firefox
RewriteRule ^/(.*)$ https://ssl.hostname/$1 [R=301]
Run Code Online (Sandbox Code Playgroud)
这也是黑名单选项 - 请记住,这存在将不使用 SNI 的客户端发送到需要 SNI 的站点的风险,但另一方面,会将使用 IE 10 之类的新事物的用户发送到右侧地方:
# IE 6
RewriteCond %{HTTP_USER_AGENT} !MSIE\s6
# Windows XP/2003
RewriteCond %{HTTP_USER_AGENT} !Windows\sNT\s5
# etc etc
RewriteRule ^/(.*)$ https://ssl.hostname/$1 [R=301]
Run Code Online (Sandbox Code Playgroud)
那里有很多浏览器。我对这些表达式一直很松散并且没有涵盖很多浏览器 - 这可能会变成维护的噩梦。
无论您选择哪个选项......祝你好运!
小智 9
我的解决方案是这样的:
# 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]
Run Code Online (Sandbox Code Playgroud)
如果没有 SNI 的旧浏览器尝试访问https://www.example.com/*那么它会首先在浏览器上抛出错误,这是无法避免的,因为直到 apache 回复非 SNI 浏览器它不知道它要求的网站。然后它重定向到一个页面,告诉用户他们的浏览器太旧了(只要用户点击继续访问网站)。
对于使用新浏览器的用户,我有
#Test if new browser and if so redirect to https
#new browser is not MSIE 5-8, not Android 0-3
RewriteCond %{HTTPS} off
RewriteCond %{HTTP_USER_AGENT} !MSIE\ [5-8]
RewriteCond %{HTTP_USER_AGENT} !Android.*(Mobile)?\ [0-3]
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]
Run Code Online (Sandbox Code Playgroud)
这不包括大多数旧浏览器,包括一些像 Vista 上的 MSIE 5-8(9+ 仅是 Vista/7,因此支持 SNI)。它不是 100%(symbian 被忽略等),但应该适用于大多数人。少数人仍然可以选择接受证书错误。
| 归档时间: |
|
| 查看次数: |
16061 次 |
| 最近记录: |