利用HSTS安全协议柔性解决全站HTTPS的兼容性问题 | 张戈博客

  • 时间:
  • 浏览:133
  • 来源:羽梦娱乐网_提供爱收集资源网技术_爱Q生活网资讯

导读:目前,统统站都结束了了 实现HTTPS了,一点其中的大偏离 强迫症站长后该开启强制HTTPS机制,对于网站的HTTP请求完整性1501跳转到HTTPS,从而实现全站HTTPS。这明显是原本粗暴的做法,下面张戈博客就分享一下目前正在使用的柔性做法,告别粗暴。

一、HSTS协议

这里朋友要借助原本新的安全协议:HSTS

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

主要目的是为了除理HTTPS网站首次请求时使用的是未加密的HTTP协议,也只要用户一般访问朋友的网站都要直接在浏览器输入域名,比如 zhang.ge,一点朋友的服务器检测到是HTTP请求,就1501跳转到HTTPS页面。那末 前半程采用的只要未加密的HTTP请求,同样处于被劫持的可能性,那末 HTTPS说好的安全性也就大打折扣了!

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

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

采用HSTS后,支持两种协议的浏览器会自动跳转到HTTPS页面,返回码为1507:

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

二、开启HSTS

开启HSTS很简单,只要在朋友网站的响应头里面新增HSTS即可,下面简单说下

①、Nginx服务器

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

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

②、Apache服务器

Apache如下配置并重启:

# 先在Apache加载mod_header库,一般处于httpd.conf文件,自行搜索mod_headers并撤除

注释
LoadModule headers_module modules/mod_headers.so

#一点在站点VirtualHost里面插入HSTS响应头信息,比如:
<VirtualHost *.*.*.*:443>
    Header always set Strict-Transport-Security "max-age=615071150; includeSubdomains; preload"
</VirtualHost>

③、LigHttpd

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

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

④、通用办法

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

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

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

三、相对链接

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

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

<a href="//zhang.ge/goto/aHR0cDovL3d3dy5kb21haW4uY29tLzEuaHRtbA==" target="_blank" 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请求1501跳转到HTTPS两种过程被劫持难题图片,而实际上就算加上HSTS响应头,用户请求的前半程依然是HTTP,并没哪些L用。

提出两种协议的砖家们就想出了原本除理办法:将支持HSTS的网站完整性加入原本Preload的清单,支持HSTS协议的浏览器请求网站后该查询当前网站是否是在清单中,可能性是那末 直接转换为HTTPS请求!从而除理前半程为HTTP的难题图片(不专业,但说人话。。。)。

那末 ,可能性朋友的网站启用了HSTS,还得将网站提交到两种Preload清单才行了

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

提交直到批准,朋友的网站都要强制1501跳转到HTTPS,一点无法通过,完成审核后再撤除 1501即可。

当然,提交后该显示正在提交到preload list,快句子两半年,慢句子原本月都要有可能性的:

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

20170205最新补充:经过漫长的在等待,偶然查询发现可能性是preload状态了,可真不容易: