如何一步步构建安全的 HTTPS 站点
副标题[/!--empirenews.page--]
通常一个 web 站点开启 HTTPS ,以 nginx 为例,我们可以这样进行配置:
上述 nginx 配置中包含了配置监听端口、开启ssl、配置证书、以及支持的加密算法。一般来说用户访问域名不可能直接在浏览器的地址栏中输入 https://www.example.com 来进行访问,而是输入域名,默认情况下是通过 HTTP 协议来进行访问的,即 http://www.example.com,因此,在nginx 的配置中我们还需要定义一个server 段来处理 HTTP 的访问。
上述配置中监听了 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 中增加响应头:
参数解释:
浏览器请求后响应头中会显示:
如图所示: HSTS 可以很好地解决 HTTPS 降级攻击,但是对于 HSTS 生效前的首次 HTTP 请求,依然无法避免被劫持。浏览器厂商们为了解决这个问题,提出了 HSTS Preload List 方案:内置一份可以定期更新的列表,对于列表中的域名,即使用户之前没有访问过,也会使用 HTTPS 协议。 目前这个 Preload List 由 Google Chrome 维护,Chrome、Firefox、Safari、IE 11 和 Microsoft Edge 都在使用。如果要想把自己的域名加进这个列表,首先需要满足以下条件:
(编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |