记录一次HSTS配置

662 阅读2分钟

HSTS

什么是HSTS?

HSTS 是 HTTP 严格传输安全(HTTP Strict Transport Security) 的缩写。 这是一种网站用来声明他们只能使用安全连接(HTTPS)访问的方法。 如果一个网站声明了 HSTS 策略,浏览器必须拒绝所有的 HTTP 连接并阻止用户接受不安全的 SSL 证书。 目前大多数主流浏览器都支持 HSTS (只有一些移动浏览器无法使用它)。

为什么要使用HSTS?

在 2012 年的 RFC 6797 中,HTTP严格传输安全被定义为网络安全标准。 创建这个标准的主要目的,是为了避免用户遭受使用 SSL stripping(剥离) 的 中间人攻击(man-in-The-middle,MITM)。 SSL stripping 是一种攻击者强迫浏览器使用 HTTP 协议连接到站点的技术,这样他们就可以嗅探数据包,拦截或修改敏感信息。 另外,HSTS 也是一个很好的保护自己免受 cookie 劫持(cookie hijacking)的方法。

如何开启HSTS?

on Apache

  1. httpd.conf文件中加载headers模块:
LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so
  1. VirtualHost 0.0.0.0:443中添加下面代码行:
<VirtualHost 0.0.0.0:443>
	ServerName mozhijiang.top
	SSLEngine on
	SSLProtocol all -SSLv2 -SSLv3
	Header always set Strict-Transport-Security "max-age=15768000; includeSubdomains; preload"
</VirtualHost>

on Nginx

server {
    listen 443 ssl;
    server_name mozhijiang.top;
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
}

includeSubDomains表示对所有子域名生效。

preload是使用浏览器内置的域名列表。

如何保证开启HSTS后只能使用HTTPS?

假设我们在已开启HSTS的网站使用http访问,mozhijiang.top。

WebServer收到请求后会将请求重定向到 HTTPS 站点,接下来浏览器使用 HTTPS访问网站,WebServer会在Response Headers里加入

Strict-Transport-Security: max-age=15768000; includeSubdomains; preload

测试一下

未开启HSTS之前

image-20220409133752544

开启之后

image-20220409134549103

image-20220409134601360

已重定向到htps://mozhijiang.top;

再次访问htps://mozhijiang.top

image-20220409134843485

Response Headers已加上

Strict-Transport-Security: max-age=15768000; includeSubdomains; preload

最后,HSTS的兼容性

image