导读 Netcraft 公司最近公布了他们检测SSL/TLS网站的研究,并指出只有仅仅5%的用户正确执行了HTTP严格传输安全HSTS。本文介绍nginx如何配置HSTS。
什么是HSTS

HTTPS(SSL和TLS)确保用户和网站通讯过程中安全,使攻击者难于拦截、修改和假冒。当用户手动输入域名或http://链接,该网站的第一个请求是未加密的,使用普通的http。最安全的网站立即发送回一个重定向使用户引向到https连接,然而,中间人攻击者可能会攻击拦截初始的http请求,从而控制用户后续的回话。

自然而然HSTS应运而生为了解决这一潜在的安全问题。即时用户输入域名或http连接,浏览器将严格的升级到https连接。

HSTS如何工作的

HSTS策略是从安全的HTTPS站点发送的HTTP响应头部发布的。

Strict-Transport-Security: max-age=31536000

当浏览器从HTTPS站点看到这个头部,就知道该域名只能通过HTTPS(SSL 或者 TLS)访问了。并将此信息缓存到31536000,也就是1年。

可选的参数includeSubDomains告诉浏览器该策略适用于当前域下的所有子域。

Strict-Transport-Security: max-age=31536000; includeSubDomains
nginx配置HSTS

在nginx配置文件上设置HSTS响应头部。

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

always 参数确保所有的响应设置该头部,包括内部产生的错误响应。nginx版本早于1.7.5不支持该always参数和内部产生的错误响应不设置该头部信息。

add_header指令继承规则:

nginx配置块继承add_header指令所在的封装块,因此只需将add_header指令放在顶级的server块。此外还有个重要的例外,如果一个块包含了add_header指令本身,它不会从封装块继承该头部,你需要重新定义所有的add_header指令。

server {
    listen 443 ssl;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # This 'location' block inherits the STS header
    location / {
        root /usr/share/nginx/html;
    }

    # Because this 'location' block contains another 'add_header' directive,
    # we must redeclare the STS header
    location /servlet {
        add_header X-Served-By "My Servlet Handler";
        add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
        proxy_pass http://localhost:8080;
    }
}

测试HTTP严格传输安全:

一旦用户提出HSTS策略,它的缓存信息期由max-age指定。在此期间,浏览器将会拒绝通过未加密的HTTP访问web服务,并拒绝给予例外证书错误(如果该网站以前提交了一个有效可信的证书)。如果指定了一个includeSubDomanis参数,这些限制也同样适用于当前域下的所有子域。

当你测试HSTS时,max-age时间设置短点。

是否每个HTTPS响应需要有一个STS头部:

我们的目标是当用户开始HTTPS回话时,尽可能快的呈现HSTS策略。如果他们在回话期间接收到HSTS策略,他们仍然容易受到HTTP劫持攻击的。浏览器只需查看一次STS头部,因此它不是严格必要将它添加到每个位置块和每个响应。然而,只在主页或者登陆页面添加它可能是不够的,如果你只添加到缓存的响应,客户端可能无法看到它。确保尽可能多的合理的覆盖到你的URL,特别注意动态的内容。

HTTP和HTTPS并行

有时网站需要同时运行在HTTP和HTTPS下

server {
    listen  80;
    listen  443 ssl;
    ...
}

有时,需要将http请求重定向到https

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;

    # Discourage deep links by using a permanent redirect to home page of HTTPS site
    return 301 https://$host;

    # Alternatively, redirect all HTTP links to the matching HTTPS page
    # return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name www.ttlsa.com;

    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
}
加强HSTS

保护客户端从HTTP拦截,从它看到STS头部到声明的max-age的期间内。然而,HSTS并不是HTTP回话劫持的完美解决方案。用户仍然容易受到攻击,如果他们通过HTTP访问HSTS保护的网站时:

  1. 以前从未访问过该网站
  2. 最近重新安装了其操作系统
  3. 最近重新安装了其浏览器
  4. 切换到新的浏览器
  5. 切换到一个新的设备如移动电话
  6. 删除浏览器的缓存
  7. 最近没访问过该站并且max-age过期了

为了解决这个问题,google坚持维护了一个“HSTS preload list”的站点域名和子域名,并通过https://hstspreload.appspot.com/提交其域名。该域名列表被分发和硬编码到主流的web浏览器。客户端访问此列表中的域名将主动的使用HTTPS,并拒绝使用HTTP访问该站点。

一旦设置了STS头部或者提交了你的域名到HSTS预加载列表,这是不可能将其删除的。这是一个单向的决定使你的域名通过HTTPS可用的。

HTTP HSTS协议和 nginx的更多相关文章

  1. 页面解耦—— 统跳协议和Rewrite引擎

    原文: http://pingguohe.net/2015/11/24/Navigator-and-Rewrite.html 解耦神器 —— 统跳协议和Rewrite引擎 Nov 24, 2015 • ...

  2. http协议和web应用有状态和无状态浅析

    http协议和web应用有状态和无状态浅析 (2013-10-14 10:38:06) 转载▼ 标签: it   我们通常说的web应用程序的无状态性的含义是什么呢? 直观的说,“每次的请求都是独立的 ...

  3. 在线聊天室的实现(1)--websocket协议和javascript版的api

    前言: 大家刚学socket编程的时候, 往往以聊天室作为学习DEMO, 实现简单且上手容易. 该Demo被不同语言实现和演绎, 网上相关资料亦不胜枚举. 以至于很多技术书籍在讲解网络相关的编程时, ...

  4. http协议和web本质

    转载:http://www.cnblogs.com/dinglang/archive/2012/02/11/2346430.html http协议和web本质 当你在浏览器地址栏敲入“http://w ...

  5. oracle网络服务之beq协议和SDU优化(性能提升可达30%)

    oracle网络服务之beq协议和SDU优化(性能提升可达30%) 12.3.1  BEQ协议 如果Oracle数据库服务端和客户端在同一台机器上,可以使用BEQ连接,BEQ连接采用进程间直接通信,不 ...

  6. Bytom BIP-32协议和BIP-44协议

    我们知道HD(分层确定性)钱包,基于 BIP-32:多币种和多帐户钱包,基于 BIP-44:最近比原社区的钱包开发者对比原的BIP-32和BIP-44协议有疑问,所以我今天就专门整理了一下该协议的内容 ...

  7. TCP协议和UDP协议基础介绍

    TCP协议和UDP协议区别 标签(空格分隔): TCP,udp TCP的三次握手 TCP被称为可靠的数据传输协议,主要是通过许多机制来实现的其中最主要的就是三次握手的功能,当然,TCP传送数据的机制非 ...

  8. Http协议和Tomcat服务器

    Http协议和Tomcat服务器 什么是Http协议 HTTP,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议. Http协议的组成 Ht ...

  9. HTTP协议和SOCKS5协议

    HTTP协议和SOCKS5协议 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我们平时上网的时候基本上是离不开浏览器的,尤其是搜索资料的时候,那么这个浏览器是如何工作的呢?用的又是 ...

随机推荐

  1. LeetCode Nested List Weight Sum

    原题链接在这里:https://leetcode.com/problems/nested-list-weight-sum/ 题目: Given a nested list of integers, r ...

  2. 11、java中的模板方法设计模式

    /* 需求:获取一段程序运行的时间. 原理:获取程序开始和结束的时间并相减即可. 获取时间:System.currentTimeMillis(); 当代码完成优化后,就可以解决这类问题. 这种方式,模 ...

  3. MFC/VC++ 响应回车键的实现

    在VC++中,要实现对回车键的响应实现,一般通过截获消息来响应,即通过处理BOOL PreTranslateMessage(MSG* pMsg)这个函数来处理 实现如下: BOOL PreTransl ...

  4. 关于Redis

    在同步dump.rdb文件时要执行service redis stop后,再拷贝目标rdb文件过去,然后再start 而不是拷贝目标rdb文件过去后直接执行restart  因为redis在执行sto ...

  5. Canvas API -- JavaScript 标准参考教程(alpha)

    Canvas API -- JavaScript 标准参考教程(alpha) Canvas API

  6. 【Python】随机模块random & 日期时间のtime&&datetime

    ■ random 顾名思义,random提供了python中关于模拟随机的一些方法.这些方法都一看就懂的,不多说了: random.random() 返回0<n<=1的随机实数 rando ...

  7. nlp词性标注

    nlp词性标注 与分词函数不同,jieba库和pyltp库词性标注函数上形式相差极大. jieba的词性标注函数与分词函数相近,jieba.posseg.cut(sentence,HMM=True)函 ...

  8. mybatis的resultMap与resultType的区别

    一.概述MyBatis中在查询进行select映射的时候,返回类型可以用resultType,也可以用resultMap,resultType是直接表示返回类型的,而resultMap则是对外部Res ...

  9. Python生成目录树代码

    用Python实现类似Windows下的tree命令,获取目录树结构. import os import os.path BRANCH = '├─' LAST_BRANCH = '└─' TAB = ...

  10. 2016江苏省CPC省赛 I - Itinerary Planning

    Description Mike moved to a new city. There are bus stations in the city, each has a unique name. Ea ...