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

  • 时间:
  • 浏览:1
  • 来源:森七博客 - 专注共享张凯博客资讯

导读:目前,所以站都现在始于实现 HTTPS 了,但会 其中的大帕累托图强迫症站长都不 开启强制 HTTPS 机制,对于网站的 HTTP 请求全版 3001 跳转到 HTTPS,从而实现全站 HTTPS。这明显是有俩个多多粗暴的做法,下面张戈博客就分享一下目前正在使用的柔性做法,告别粗暴。

一、HSTS 协议

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

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

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

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

以往分享的全站 HTTPS 都不 采用 3001 强制性跳转,但会 都不 区分下低版本 IE、不支持 HTTPS 的搜索引擎来忽略 3001 跳转,很明显很久做无法照顾到所有情况表。没法 但会 是用 HSTS 呢?

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

而不支持 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=6300730000; 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=6300730000; includeSubdomains; preload"

③、LigHttpd

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

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

④、通用最好的土办法

但会 你用的虚拟主机,但会 很多再折腾 WEB 软件,没法 可不可不可否 采用更简单的通用最好的土办法。原理很简单,通过代码来新增响应头即可,这里只分享一下 php 的做法,其他语言自行参考:

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

header("Strict-Transport-Security: max-age=6300730000; 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 请求 3001 跳转到 HTTPS 三种过程被劫持问提报告 ,而实际上就算去掉 HSTS 响应头,用户请求的前半程依然是 HTTP,并没法 那些 L 用。

提出三种协议的砖家们就想出了有俩个多多处置最好的土办法:将支持 HSTS 的网站全版加入有俩个多多 Preload 的清单,支持 HSTS 协议的浏览器请求网站都不 查询当前网站是有无在清单中,但会 是没法 直接转换为 HTTPS 请求!从而处置前半程为 HTTP 的问提报告 (不专业,但说人话。。。)。

没法 ,但会 大伙儿的网站启用了 HSTS,还得将网站提交到三种 Preload 清单才行了

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

提交直到批准,大伙儿的网站时要强制 3001 跳转到 HTTPS,但会 无法通过,完成审核后再取消 3001 即可。

当然,提交都不 显示正在提交到 preload list,快说说两三天,慢说说有俩个多多月都不 有但会 的:

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

20170205 最新补充:经过漫长的等待,偶然查询发现但会 是 preload 情况表了,可真不容易:

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

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