返回

启用HSTS和强制HTTPS访问

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

启用HSTS

HSTS 是一个响应头,格式如下:

Strict-Transport-Security: max-age=15552000; includeSubDomains; preload
  1. max-age,单位是秒,用来告诉浏览器在指定时间内,这个网站必须通过 HTTPS 协议来访问。也就是对于这个网站的 HTTP 地址,浏览器需要先在本地替换为 HTTPS 之后再发送请求
  2. includeSubDomains,可选参数,如果指定这个参数,表明这个网站所有子域名也必须通过 HTTPS 协议来访问
  3. preload,可选参数,预加载到浏览器缓存

本站采用的是Nginx,具体做法是在站点的配置文件里面 server { ……. add_header Strict-Transport-Security: max-age=15552000; includeSubDomains; preload #启用HSTS,加上这一段即可 }

但是这样做,用户在第一次访问站点时候如果没有通过https访问的话依旧是普通http的访问,所以下一步我使用rewrite的方法强制https访问,通过以下代码实现:

server {
    listen 80 ;
    listen [::]:80 ;
    server_name wwww.lvmoo.com;
    rewrite ^/(.*) https://wwww.lvmoo.com/$1 permanent;
}

server {
        add_header Strict-Transport-Security "max-age=15552000; includeSubDomains; preload";
        add_header X-Frame-Options SAMEORIGIN;
        add_header X-Content-Type-Options nosniff;
        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        listen 443 ssl http2 ;
        listen [::]:443 ssl http2 ;
        ssl_certificate /srv/www/wwww.lvmoo.com.crt;
        ssl_certificate_key /srv/www/wwww.lvmoo.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        #ssl_ciphers   HIGH:!aNULL:!MD5;
        ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;

        ssl_prefer_server_ciphers   on;

            .................
        ......
    
    }

这样的话访问http就会强制跳转到https啦!

类似其他的服务器可以使用如下方法开启HSTS

  • Apache2

    #Optionally load the headers module: LoadModule headers_module modules/mod_headers.so

    <VirtualHost 0.0.0.0:443> Header always set Strict-Transport-Security “max-age=15552000; includeSubdomains; preload” #X-Frame-Options 头部添加到HTTPS站点,确保不会嵌入到frame 或 iframe Header always set X-Frame-Options DENY

  • Lighttpd

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

    #X-Frame-Options 头部添加到HTTPS站点,确保不会嵌入到frame 或 iframe server.modules += ( “mod_setenv” ) $HTTP[“scheme”] == “https” { setenv.add-response-header = ( “X-Frame-Options” => “DENY”) }

申请 HSTS Preload List

HSTS 必须要在浏览器访问过你的网站一次以后才会生效,如果希望提前生效,需要申请 HSTS Preloading List。

目前这个 Preload List 由 Google Chrome 维护,Chrome、Firefox、Safari、IE 11 和 Microsoft Edge 都在使用。如果要想把自己的域名加进这个列表,首先需要满足以下条件:

  1. 拥有合法的证书(如果使用 SHA-1 证书,过期时间必须早于 2016 年);
  2. 将所有 HTTP 流量重定向到 HTTPS;
  3. 确保所有子域名都启用了 HTTPS;
  4. 输出 HSTS 响应头: max-age 不能低于 18 周(10886400 秒); 必须指定 includeSubdomains 参数; 必须指定 preload 参数;

一切妥当后到 HSTS Preload List (hstspreload.appspot.com) 申请。

截至到目前,lvmoo.com 的状态为: Status: lvmoo.com is pending submission to the preload list.

申请好之后,就可以到在 chromium 的 transport_security_state_static.json 中可以查看到自己的站点了! 火狐浏览器可以在这个站点查询nsSTSPreloadList.inc

接下来要做的就是等待了,等待~

目前浏览器对HSTS支持情况: Strict Transport Security

文章参考:

  1. 启用HSTS和申请HSTS Preload List
  2. nginx、Apache、Lighttpd启用HSTS
Licensed under CC BY-NC-SA 4.0
最后更新于 Jan 23, 2017 17:10 UTC