HTTP 严格传输安全HSTS

HTTP 严格传输安全HSTS

  1. 简介

    1
    HTTP严格传输安全(HSTS)是一种安全功能,WEB服务器通过它来告诉浏览器仅用HTTPS来与之通讯,而不是使用HTTP.
  2. HSTS是什么?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    如果一个WEB服务器支持HTTP访问,并将其重定向到HTTPS访问的话,那么访问者在重定向前的初始会话是非加密的.这就给了中间人攻击的一个机会,重定向可能会被破坏,从而定向到一个恶意站点而不是应该访问的加密页面

    HTTP严格传输安全(HSTS)功能使WEB服务器告知浏览器绝不使用HTTP访问,在浏览器端自动将所有到该站点的HTTP访问替换为HTTPS访问

    HSTS可以用来抵御SSL剥离攻击: SSL剥离攻击是中间人攻击的一种,由Moxie Marlinspike于2009年发明.他在当年的黑帽大会上发表的题为"New Tricks For Defeating SSL In Practice"的演讲中将这种攻击方式公开.SSL剥离的实施方法是阻止浏览器与服务器创建HTTPS连接.它的前提是用户很少直接在地址栏输入"https://",用户总是通过点击链接或3xx重定向,从HTTP页面进入HTTPS页面.所以攻击者可以在用户访问HTTP页面时替换所有"https://"开头的链接为"http://",达到阻止HTTPS的目的

    HSTS可以很大程度上解决SSL剥离攻击,因为只要浏览器曾经与服务器创建过一次安全连接,之后浏览器会强制使用HTTPS,即使链接被换成了HTTP.另外,如果中间人使用自己的自签名证书来进行攻击,浏览器会给出警告,但是许多用户会忽略警告.HSTS解决了这一问题,一旦服务器发送了HSTS字段,用户将不再允许忽略警告

    注意: 如果你之前没有使用HTTPS访问过该站点,那么HSTS是不奏效的.网站需要通过HTTPS协议告诉你的浏览器它支持HSTS
  3. 服务端开启HSTS

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的HTTP响应头中包含"Strict-Transport-Security"字段.非加密传输时设置的HSTS字段无效.

    nginx:
    在https的server中设置:
    add_header Strict-Transport-Security "max-age:63072000;includeSubdomains;preload";

    apache:
    在virtualhost中添加:
    <VirtualHost 1.1.1.1:443>
    Header always set Strict-Transport-Security "max-age:63072000;includeSubdomains;preload"
    </VirtualHost>

    //HTTP重定向HTTPS
    <VirtualHost *:80>
    ServerName test.com
    Redirect permanent / https://test.com/
    </VirtualHost>

    综上,
    在你的WEB站点在每次访问时都会发送该请求头,失效时间是两年(秒数).这个失效时间每次都会设置为两年后,所以,明天你访问时,它会设置为明天的两年后