设为首页 - 加入收藏 大兴安岭网 (http://www.0457zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 数据 公司 手机 发布
当前位置: 首页 > 运营中心 > 网站设计 > 教程 > 正文

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

发布时间:2019-04-03 19:57 所属栏目:[教程] 来源: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

?如何一步步构建安全的 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;;?
  11. }?

上述 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. ?}?
  7. }?

上述配置中监听了 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. ?...?
  5. }?

参数解释:

  • 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 参数;

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章