以前基于nginx为网站配置了HTTPS服务,配置过程当中涉及到两个知识点:php
本文主要是经过梳理一下相关概念,理清这两种配置的目的。html
HTTPS,也称做HTTP over TLS,TLS的前身是SSL。HTTPS 相比 HTTP 提供了数据完整性、 数据隐私性和身份认证的功能。nginx
SSL通讯过程 web
在nginx中的配置方法算法
server {
listen 443;
server_name www.example.com; #填写绑定证书的域名
ssl on;
ssl_certificate /etc/nginx/sslconfig/1_www.example.com_bundle.crt;
ssl_certificate_key /etc/nginx/sslconfig/2_www.example.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
root html; #站点目录
index index.html index.htm;
# proxy_pass http://$server_name:8920;
}
复制代码
中间人攻击(Man-in-the-middle attack,缩写:MITM)是指攻击者与通信的两端分别创建独立的联系,并交换其所收到的数据,使通信的两端认为他们正在经过一个私密的链接与对方直接对话,但事实上整个会话都被攻击者彻底控制并进行数据篡改和嗅探。浏览器
HSTS,即HTTP Strict-Transport-Security。 当站点经过 HTTPS 运行的时候,服务器经过返回一个响应头部 Strict-Transport-Security
,强制浏览器之后使用 HTTPS 进行通讯。缓存
Strict-Transport-Security: max-age=<expire-time>
Strict-Transport-Security: max-age=<expire-time>; includeSubDomains
Strict-Transport-Security: max-age=<expire-time>; preload
复制代码
一个网站接受一个 HTTP 的请求,而后跳转到 HTTPS ,用户可能在开始跳转前,经过没有加密的方式和服务器对话,这样存在中间人攻击潜在威胁,跳转过程可能被恶意网站利用来直接接触用户信息,而不是原来的加密信息。
HTST 是在初次经过访问 HTTPS 链接并返回安全头以后,浏览器记录下这些信息。有效期内,当浏览器再次试图经过 HTTP 与服务器创建链接只会返回307 Temporary Redirect
,浏览器禁止加载 HTTP 信息,并将链接重定向到 HTTPS 。一个测试的结果以下:安全
在nginx中配置响应信息bash
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
复制代码
浏览器返回结果 服务器
HTTP 301 永久重定向
说明请求的资源已经被移动到了由 Location 头部指定的url上,是固定的不会再改变,搜索引擎会根据该响应修正,在 SEO 中301跳转对网站的权重会产生影响。
咱们注意到,咱们已经在nginx中已经配置了return 301 https://$server_name$request_uri
,将HTTP请求重定向到HTTPS。可是,在前面的浏览器测试结果中,经过HTTP访问并无显示301永久重定向,而是307临时重定向。实际上,301 仍然是发生的,301是服务器层面上的重定向,而307是浏览器层面上的重定向。咱们经过 httpstatus 进行测试,能够看到直观的结果:
咱们已经说明了HSTS和301的做用,可是咱们可能仍然有些困惑:
总之,中间人攻击不可能简单地经过某一种策略来彻底阻止,可是聊胜于无,HSTS 仍然是个可行的安全策略。
参考了一些博客和讨论,若有错误欢迎指正。