当前位置:首页 > Web开发 > 正文

# we must redeclare the STS headerlocation / servlet { add_h

2024-03-31 Web开发

  本文是《9012年了,还不会Https》的后篇,本文着重聊一聊 HTTP Strict Transport Security协议的观点和应用。

启用HTTPS还不够安适

  站点通过HTTPS 对外供给处事,用户在访谒某站点,往往会直接输入站点域名,而不是完整的HTTPS地点,站点一般会发送301重定向,要求浏览器升级到HTTPS连接。

将所有非安适请求重定向到安适URL是通例做法,但是中间人仍然可以在重定向产生前劫持连接。

技术图片

  HSTS指示浏览器只能使用HTTPS访谒域名,来措置惩罚惩罚潜在的中间人劫持危害。即使用户输入或使用普通的HTTP连接,浏览器也严格将连接升级到HTTPS。

HSTS

HSTS是一种可选的安适增强计谋,已经由IETF RFC6797中指定。

处事端通过Strict-Transport-Security响应头来通知客户端应用 HSTS协议。

Strict-Transport-Security: max-age=31536000; includeSubDomains
# inclueSubDomains 是可选参数,奉告浏览器将HSTS计谋用到当前域的子域。

一旦浏览器承认这个响应头,知晓访谒这个域名的所有请求必需使用HTTPS连接,将会在1年时间内缓存这个约定。

当撑持 HSTS的浏览器承认该响应头:

浏览器为域名存储(阻止请求使用HTTP连接)配置,浏览器将强制所有请求通过 HTTPS

浏览器阻止用户使用不安适/无效证书,会显示禁用提示(允许用户姑且信任该证书)

因为HSTS计谋由客户端强制执行,有一些前置条件:

客户端必需撑持 HSTS 协议

必需要有一次告成的HTTPS请求,这样才华成立HSTS 计谋

Preload HSTS

细心的你可能发明,HSTS还是存在一个单薄缝隙,那就是浏览器没有当前HSTS信息,或者第一次访谒; 或者新操纵系统,浏览器重装,断根浏览器缓存;HSTS信息的max-age过期;

依然需要一次明文HTTP请求和重定向才华升级到HTTPS并 刷新HSTS信息,这一次依然给打击者可乘之机,针对以上打击,HSTS的应对步伐是在浏览器内置一个域名列表,这个列表内域名,浏览器城市使用HTTPS倡议连接,这个列表由Chrome维护,主流浏览器均在使用。

Nginx

在Nginx中设置 HSTS相对简单:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# always 参数确保所有的响应都有 STS Header, 旧版本(低于1.7.5)不撑持always参数。

nginx add_header 的担任法则:

如果某个配置块包罗一个add_header 指令,,那么将不会担任上层的headers, 因此你需要在内部配置块重申 add_header 指令。

server { listen 443 ssl; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # This location block inherits the STS header location / { root /usr/share/nginx/html; } # Because this location block contains another add_header directive, # we must redeclare the STS header location /servlet { add_header X-Served-By "My Servlet Handler"; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; proxy_pass http://localhost:8080; } }

ASP.NETCore的福利时间

若使用 Kestrel 作为边沿(face-to-internet) web处事器, 参见下面的处事配置

为STS header设置了preload参数,Preload不是RFC HSTS规范的一部分,但是浏览器撑持在全新安置时预加载HSTS网站

指定子域或排除的子域 使用HSTS协议

设置浏览器缓存 [访谒站点的请求均使用HTTPS协议] 这一约定的时间,默认是30天。

public void ConfigureServices(IServiceCollection services) { services.AddMvc(); services.AddHsts(options => { options.Preload = true; options.IncludeSubDomains = true; options.MaxAge = TimeSpan.FromDays(60); options.ExcludedHosts.Add("example.com"); options.ExcludedHosts.Add(""); }); services.AddHttpsRedirection(options => { options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect; options.HttpsPort = 5001; }); }

请注意: UseHsts 对付本地回送 hosts 并不生效

localhost: IPv4回送地点

127.0.0.1    IPv4回送地点

[::1]             IPv6回送地点

这也是开发者在本地启动时 抓不到  Strict-Transport-Security 响应头的原因。

下面给出启用了 HSTS的 功效示例:

技术图片

+ nginx 启用HSTS:  https://www.nginx.com/blog/http-strict-transport-security-hsts-and-nginx/

+ chrome断根HSTS信息: https://www.ssl2buy.com/wiki/how-to-clear-hsts-settings-on-chrome-firefox-and-ie-browsers

HTTP Strict Transport Security (HSTS) in ASP.NET Core

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/32034.html