文章开头,先祝福武汉,祝福中国,希望我大中国的疫情早点结束,早日恢复正常!
由于假期延长,在家把服务器折腾了下,废弃 TLS 1.0 与 TLS 1.1 的支持,添加 TLS 1.3 的支持,并在 NGINX 开启 HSTS(HTTP Strict Transport Security) 的支持,使得网站评分达到 A+ 级别,这可能就是所谓的折腾吧,总喜欢折腾,优化到最佳,这里先放上评测截图:
A+截图:
TLS1.0 、TLS1.1 废弃与 TLS1.3 支持:
1. 开启 HSTS
1.1 介绍
HSTS介绍:这是一个响应头,用来强制启用HTTPS协议,解决301跳转的劫持的问题。说人话就是强制客户端(如浏览器)使用 HTTPS 与服务器创建连接。
此前大部分站长都会开启 HTTP 强制跳转 HTTPS ,也就是网站的 HTTP 请求全部 301 跳转到 HTTPS,从而实现全站 HTTPS,这种方式比较粗暴,因为当用户在浏览器输入 timhbw.com 的时候,服务器使用的是 HTTP 请求,会增加一次请求时间,也同样存在被劫持的可能,采用 HSTS 后,支持这个协议的浏览器会自动跳转到 HTTPS 页面,可以通过状态码 307 判断。
Strict-Transport-Security: max-age=expireTime [; includeSubDomains] [; preload]
此响应头只有在 https 访问返回时才生效,其中[ ]中的参数表示可选
- max-age:HSTS 功能生效时间,单位是秒(300 -> 5分钟、604800 -> 1 周、2592000 -> 一个月),也就是说在这段时间内,浏览器将始终强制采用 HTTPS 来访问相应的网址;
- includeSubDomains:如果指定,则表示域名(例如:timhbw.com)对应的每个子域名(例如:cdn.timhbw.com 或 test.cdn.timhbw.com),浏览器在访问时也都会强制采用 HTTPS 进行访问,影响面较广,谨慎添加;
- preload:如果指定,则表示此域名同意申请加入由 Google 发起的 Preload List。
1.2 利弊介绍
HSTS是把双刃剑,确认知晓用途后再开启,否则可能会被折腾哭
- 优点:开启后无需再使用 301 让 HTTP 强制跳转 HTTPS ,支持这个协议的浏览器会自动跳转到 HTTPS,降低第一次访问被劫持的风险与请求次数;
- 缺点:比如您的域名不再使用 https 了,后期想使用 http,即使您把 nginx 中的 ssl 配置文件删除,浏览器还是会自动跳转到 https,让人摸不到头脑,下面是取消步骤,依次排查:
- nginx 中删除 Strict-Transport-Security 相关配置
- 去这个网站查询是否提交过 HSTS :https://hstspreload.appspot.com (需要扶墙访问),如果是 preload 状态那还得提交取消,生效时间 2、3 天或者 30 天左右都是有可能的
- 浏览器本地删除 HSTS 配置:chrome://net-internals/#hsts,Query 处进行查询,Delete 处进行删除
1.3 开始配置
这里以宝塔面板为例,使用 lnmp.org、oneinstack 配置的环境配置差不多,都是修改 nginx 配置文件。
1.3.1 nginx 配置文件添加
也就是宝塔面板内新建的所有站点都会包含这个配置。进入宝塔面板首页,找到 nginx,点击【配置修改】在 http 内添加如下代码,添加完毕后记得重启下 nginx
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
1.3.2 网站配置文件添加。
也就是只修改该网站的配置,其他网站配置不变。找到对应域名,点击【配置文件】在 server 内添加如下代码,添加完毕后记得重启下 nginx,推荐此方案,影响面较小:
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
1.4 提交申请
如果没有提交申请的话,其实就算加上 HSTS,用户输入域名后的前半程仍然是 HTTP ,必须把域名加入 Google 发起的 Preload List 中,然后会被硬编码到浏览器中,所以提交请求后生效时间在两三天或者一个月不等。等于加入这个清单后,用户输入timhbw.com,如果是在这个清单内,浏览器则会直接请求 HTTPS 。
申请网址:https://hstspreload.appspot.com (需要扶墙访问)
1.5 检测
浏览器直接输入域名,不要加协议,比如 timhbw.com,看下是否是 307 跳转。可以看到输入 timhbw.com 后,会有一个 307 跳转,然后会有一个 200 的 https 请求。并且 307 状态码的请求头有这样的标识 “Provisional headers are shown”, 可以理解为浏览器拦截了该请求,并且该请求并没有发送出去,因为浏览器发现该域名需要使用https来请求,所以就发了第二次https请求了。
2. 支持 TLS1.3
参考 1.3.2 中的步骤,修改宝塔面板内的所有配置文件中的 ssl_protocols 与 ssl_ciphers 参数,然后重启 nginx 服务器:
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;
最后附上 ssllabs 检测截图: