加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

如何一步步构建安全的 HTTPS 站点

发布时间:2019-04-02 17:22:09 所属栏目:教程 来源:IT之鹰
导读:通常一个 web 站点开启 HTTPS ,以 nginx 为例,我们可以这样进行配置: server{ listen443sslhttp2; server_namewww.example.com; indexindex.htmlindex.htm; root/www/www; sslon; ssl_protocolsTLSv1TLSv1.1TLSv1.2; ssl_certificate/usr/local/nginx/s
副标题[/!--empirenews.page--]

 如何一步步构建安全的 HTTPS 站点

通常一个 web 站点开启 HTTPS ,以 nginx 为例,我们可以这样进行配置:

  1. server { 
  2.  listen 443 ssl http2; 
  3.  server_name www.example.com; 
  4.  index index.html index.htm; 
  5.  root /www/www; 
  6.  ssl on; 
  7.  ssl_protocols TLSv1 TLSv1.1 TLSv1.2; 
  8.  ssl_certificate /usr/local/nginx/ssl/example.com.rsa.cer; 
  9.  ssl_certificate_key /usr/local/nginx/ssl/example.com.rsa.key; 
  10.  ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;; 

上述 nginx 配置中包含了配置监听端口、开启ssl、配置证书、以及支持的加密算法。一般来说用户访问域名不可能直接在浏览器的地址栏中输入 https://www.example.com 来进行访问,而是输入域名,默认情况下是通过 HTTP 协议来进行访问的,即 http://www.example.com,因此,在nginx 的配置中我们还需要定义一个server 段来处理 HTTP 的访问。

  1. server { 
  2.  listen 80 default_server; 
  3.  server_name _ www.example.com; 
  4.  location / { 
  5.  return 302 https://$host$request_uri; 
  6.  } 

上述配置中监听了 80端口,并且定义了一个 location,将 HTTP 请求 302 跳转到 HTTPS 的Host 去。这样就实现了用户不管怎么访问都可以跳转到 HTTPS 。

但是问题来了,这样的配置其实是有缺陷的,如果用户端从浏览器手动输入的是 HTTP 地址,或者从其它地方点击了网站的 HTTP 链接,那么浏览器会依赖于服务端 301/302 跳转才能使用 HTTPS 服务。而第一次的 HTTP 请求就有可能被劫持,因为中间的数据传输是明文的,就有可能会导致请求无法到达服务器,从而构成 HTTPS 降级劫持。

要解决降级劫持,我们可以使用HSTS。

什么是 HSTS?

HSTS(HTTP Strict Transport Security,HTTP 严格传输安全),是一套由互联网工程任务组发布的互联网安全策略机制。网站可以通过配置 HSTS,来强制浏览器使用 HTTPS 与网站通信,保障网站更加安全。

HSTS的作用是强制客户端(如浏览器)使用HTTPS与服务器创建连接。服务器开启HSTS的方法是,当客户端通过HTTPS发出请求时,在服务器返回的超文本传输协议响应头中包含 `Strict-Transport-Security` 字段。非加密传输时设置的`HSTS`字段无效。

比如,`https://example.com/`的响应头含有`Strict-Transport-Security: max-age=31536000; includeSubDomains`。这意味着两点:

在接下来的一年(即31536000秒)中,浏览器只要向`example.com`或其子域名发送HTTP请求时,必须采用`HTTPS`来发起连接。比如,用户点击超链接或在地址栏输入 `http://www.example.com/` ,浏览器应当自动将 http 转写成 `https`,然后直接向 `https://www.example.com/` 发送请求。

在接下来的一年中,如果 `example.com` 服务器发送的`TLS`证书无效,用户不能忽略浏览器警告继续访问网站。

如何进行配置?

以 nginx 为例,我们在对应域名的 vhost 中增加响应头:

  1. server { 
  2.  .... 
  3.  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"; 
  4.  ... 

参数解释:

  • max-age,单位是秒,用来告诉浏览器在指定时间内,这个网站必须通过 HTTPS 协议来访问。也就是对于这个网站的 HTTP 地址,浏览器需要先在本地替换为 HTTPS 之后再发送请求。
  • includeSubDomains,可选参数,如果指定这个参数,表明这个网站所有子域名也必须通过 HTTPS 协议来访问。
  • preload,可选参数,HSTS 这个响应头只能用于 HTTPS 响应;网站必须使用默认的 443 端口;必须使用域名,不能是 IP。而且启用 HSTS 之后,一旦网站证书错误,用户无法选择忽略。

浏览器请求后响应头中会显示:

  1. strict-transport-security:max-age=31536000 

如图所示:

HSTS 可以很好地解决 HTTPS 降级攻击,但是对于 HSTS 生效前的首次 HTTP 请求,依然无法避免被劫持。浏览器厂商们为了解决这个问题,提出了 HSTS Preload List 方案:内置一份可以定期更新的列表,对于列表中的域名,即使用户之前没有访问过,也会使用 HTTPS 协议。

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

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

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读