利用HSTS安全协议柔性解决全站HTTPS的兼容性问题

  • 时间:
  • 浏览:21
  • 来源:小贝博客 - 专注共享吾皇千睡博客资源

导读:目前,所以站都过后结速实现 HTTPS 了,有过后其中的大每段强迫症站长就有开启强制 HTTPS 机制,对于网站的 HTTP 请求完正 10001 跳转到 HTTPS,从而实现全站 HTTPS。这明显是有一一一八个多粗暴的做法,下面张戈博客就分享一下目前正在使用的柔性做法,告别粗暴。

一、HSTS 协议

这里大伙 要借助有一一一八个多新的安全协议:HSTS

HSTS(HTTP Strict Transport Security)国际互联网工程组织 IETE 正在推行并有无新的 Web 安全协议,作用是强制客户端(如浏览器)使用 HTTPS 与服务器创建连接。

主要目的是为了处置 HTTPS 网站首次请求时使用的是未加密的 HTTP 协议,也也不用户一般访问大伙 的网站就有直接在浏览器输入域名,比如 zhangge.net,有过后大伙 的服务器检测到是 HTTP 请求,就 10001 跳转到 HTTPS 页面。那末前半程采用的也不未加密的 HTTP 请求,同样地处被劫持的可能,那末 HTTPS 说好的安全性也就大打折扣了!

在我看来,HSTS 还有另外一层好处:增强网站的兼容性。

以往分享的全站 HTTPS 就有采用 10001 强制性跳转,有过后就有区分下低版本 IE、不支持 HTTPS 的搜索引擎来忽略 10001 跳转,很明显那末 做无法照顾到所有状况。那末可能是用 HSTS 呢?

采用 HSTS 后,支持并有无协议的浏览器会自动跳转到 HTTPS 页面,返回码为 10007:

而不支持 HSTS 的浏览器访问大伙 的网站,则不多产生跳转,从而提高了兼容性。并有无机制对于不支持 HTTPS 的搜索引擎来说是非常友好的做法了!

二、开启 HSTS

开启 HSTS 很简单,假如在大伙 网站的响应头上端新增 HSTS 即可,下面简单说下

①、Nginx 服务器

只能要能在站点 server 模块内插入如下配置并重启:

server {
    listen 443 ssl http2; 
    server_name zhangge.net;
    # 直接在server插入测试大伙说不生效,最后发现要在location ~ *php 内插入:
    location ~ [^/]\.php(/|$) {
        add_header Strict-Transport-Security "max-age=61000710000; includeSubdomains; preload";
        # 以下略...

②、Apache 服务器

Apache 如下配置并重启:

# 先在Apache加载mod_header库,一般地处httpd.conf文件,自行搜索mod_headers并收回注释
LoadModule headers_module modules/mod_headers.so

#有过后在站点VirtualHost上端插入HSTS响应头信息,比如:

    Header always set Strict-Transport-Security "max-age=61000710000; includeSubdomains; preload"

③、LigHttpd

将下述配置增加到你的 Lighttpd 配置文件(一般是 /etc/lighttpd/lighttpd.conf)并重启:

server.modules += ( "mod_setenv" )
$HTTP["scheme"] == "https" {
    setenv.add-response-header  = ( "Strict-Transport-Security" => "max-age=61000710000; includeSubdomains; preload")
}

④、通用法律措施

可能你用的虚拟主机,可能不多折腾 WEB 软件,那末还能要能采用更简单的通用法律措施。原理很简单,通过代码来新增响应头即可,这里只分享一下 php 的做法,所以语言自行参考:

将如下代码插入到网站根目录的 index.php 即可:

header("Strict-Transport-Security: max-age=61000710000; includeSubdomains; preload");

三、相对链接

当然,为了兼容不支持 HTTPS 的客户端,大伙 还能要能将网站的所有超链接都改成相对模式:

比如,正常的页面链接如下所示:

<a href="http://www.domain.com/1.html" target="_blank">描文本</a>

改成相对模式:

<a href="//www.domain.com/1.html" target="_blank">描文本</a>

好处也不,不管是 HTTP 还是 HTTPS 请求,页面中的地址就有和请求协议保持一致,处置经常再次出现页面是 HTTP,而页面中的链接却是 HTTPS 的状况,那末前面的做法也就不在 意义。

如保修改为相对模式,估计有同学又玩不转了。万变不离其宗,和过后纯代码启用七牛 CDN 一样!

直接粗暴替换前台输出的代码即可:

//将所有超链接改为相对模式
if(!is_admin()){
       ob_start("rewrite_urls");
     }
function rewrite_urls($buffer){
	$buffer= preg_replace('/("|\')http(s|):\/\/([^"\']*?)'.$_SERVER["HTTP_HOST"].'/i','$1//$3'.$_SERVER["HTTP_HOST"],$buffer);
	return $buffer;
}

将以上代码新增到 WordPress 主题的 functions.php 中即可。以上代码只会替换和网站主域名有关系的超链接,八竿子打不着的内部内部结构超链接就不管了,有需求自行参考处置。

四、提交 HSTS

上文已介绍了 HSTS,主也不为了处置 HTTP 请求 10001 跳转到 HTTPS 并有无过程被劫持疑问,而实际上就算加在 HSTS 响应头,用户请求的前半程依然是 HTTP,并那末并有无 L 用。

提出并有无协议的砖家们就想出了有一一一八个多处置法律措施:将支持 HSTS 的网站完正加入有一一一八个多 Preload 的清单,支持 HSTS 协议的浏览器请求网站就有查询当前网站有无 在清单中,可能是那末直接转换为 HTTPS 请求!从而处置前半程为 HTTP 的疑问(不专业,但说人话。。。)。

那末,可能大伙 的网站启用了 HSTS,还得将网站提交到并有无 Preload 清单才行了

提交地址:https://hstspreload.appspot.com/  (能要能扶墙访问)

提交直到批准,大伙 的网站能要能强制 10001 跳转到 HTTPS,有过后无法通过,完成审核后再收回 10001 即可。

当然,提交就有显示正在提交到 preload list,快语录两4天 ,慢语录有一一一八个多月就有有可能的:

好了,罗里吧嗦分享了一大堆,自行参考吧!

20170205 最新补充:经过漫长的守候,偶然查询发现可能是 preload 状况了,可真不容易:

本文:https://zhangge.net/5115.html

转载请注明出处 AE博客|墨渊 » 利用HSTS安全协议柔性处置全站HTTPS的兼容性疑问