0

    开启HSTS让浏览器强制跳转HTTPS访问

    2023.08.10 | admin | 137次围观

    解决这个问题目前有两种方案:

    方案一:在浏览器预置HSTS域名列表,就是上面提到的HSTS Preload List方案。该域名列表被分发和硬编码到主流的Web浏览器。客户端访问此列表中的域名将主动的使用HTTPS,并拒绝使用HTTP访问该站点。

    方案二:将HSTS信息加入到域名系统记录中。但这需要保证DNS的安全性,也就是需要部署域名系统安全扩展。

    其它可能存在的问题

    由于HSTS会在一定时间后失效(有效期由max-age指定),所以浏览器是否强制HSTS策略取决于当前系统时间。大部分操作系统经常通过网络时间协议更新系统时间,如Ubuntu每次连接网络时,OS X Lion每隔9分钟会自动连接时间服务器。攻击者可以通过伪造NTP信息,设置错误时间来绕过HSTS。

    解决方法是认证NTP信息,或者禁止NTP大幅度增减时间。比如:Windows 8每7天更新一次时间,并且要求每次NTP设置的时间与当前时间不得超过15小时。

    支持HSTS浏览器

    目前主流浏览器都已经支持HSTS特性,具体可参考下面列表:

    HSTS部署

    服务器开启HSTS的方法是:当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段。非加密传输时设置的HSTS字段无效。

    最佳的部署方案是部署在离用户最近的位置ie浏览器老是未响应,例如:架构有前端反向代理和后端Web服务器,在前端代理处配置HSTS是最好的,否则就需要在Web服务器层配置HSTS。如果Web服务器不明确支持HSTS,可以通过增加响应头的机制。如果其他方法都失败了,可以在应用程序层增加HSTS。

    HSTS启用比较简单ie浏览器老是未响应,只需在相应头中加上如下信息:

    Strict-Transport-Security: max-age=63072000; includeSubdomains;preload;

    Strict-Transport-Security是Header字段名,max-age代表HSTS在客户端的生效时间。 includeSubdomains表示对所有子域名生效。preload是使用浏览器内置的域名列表。

    HSTS策略只能在HTTPS响应中进行设置,网站必须使用默认的443端口;必须使用域名,不能是IP。因此需要把HTTP重定向到HTTPS,如果明文响应中允许设置HSTS头,中间人攻击者就可以通过在普通站点中注入HSTS信息来执行DoS攻击。

    开启HSTS让浏览器强制跳转HTTPS访问

    Apache上启用HSTS

    $ vim /etc/apache2/sites-available/hi-linux.conf
    # 开启HSTS需要启用headers模块
    LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
    
      ServerName www.hi-linux.com
      ServerAlias hi-linux.com
    ...
     #将所有访问者重定向到HTTPS,解决HSTS首次访问问题。
      RedirectPermanent / https://www.hi-linux.com/
    
    
    ...
    # 启用HTTP严格传输安全
      Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains; preload"
    ...
    

    重启Apache服务

    $ service apche2 restart

    Nginx上启用HSTS

    $ vim /etc/nginx/conf.d/hi-linux.conf
    server {
       listen 443 ssl;
       server_name www.hi-linux.com;
       add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    ...
    }
    server {
       listen 80;
       server_name www.hi-linux.com;
       return 301 https://www.hi-linux.com$request_uri;
    ...
    }

    重启Nginx服务

    $ service nginx restart

    IIS启用HSTS

    要在IIS上启用HSTS需要用到第三方模块,具体可参考:

    测试设置是否成功

    设置完成了后,可以用curl命令验证下是否设置成功。如果出来的结果中含有Strict-Transport-Security的字段,那么说明设置成功了。

    $ curl -I https://www.hi-linux.com
    HTTP/1.1 200 OK
    Server: nginx
    Date: Sat, 27 May 2017 03:52:19 GMT
    Content-Type: text/html; charset=utf-8
    ...
    Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
    X-Frame-Options: deny
    X-XSS-Protection: 1; mode=block
    X-Content-Type-Options: nosniff
    ...

    对于HSTS以及HSTS Preload List,建议是只要不能确保永远提供HTTPS服务,就不要启用。因为一旦HSTS生效,之前的老用户在max-age过期前都会重定向到HTTPS,造成网站不能正确访问。唯一的办法是换新域名。

    参考文档

    版权声明

    本文仅代表作者观点。
    本文系作者授权发表,未经许可,不得转载。

    发表评论