前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HTTP Strict Transport Security (HSTS) in ASP.NET Core

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

作者头像
有态度的马甲
发布2020-04-16 15:01:50
8190
发布2020-04-16 15:01:50
举报
文章被收录于专栏:精益码农精益码农

本文是《2020年了,再不会HTTPS就老了》的后篇,本文着重聊一聊HTTP Strict Transport Security协议的概念和应用。

启用 HTTPS 还不够安全

现在很多站点通过HTTPS对外提供服务,用户在访问某站点,往往会直接输入站点域名(baidu.com),而不是完整的HTTPS地址(https://www.baidu.com),站点一般会发送301重定向,要求浏览器升级到HTTPS连接。

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

  HSTS指示浏览器只能使用HTTPS访问域名,来处理潜在的中间人劫持风险。即使用户输入或使用普通的HTTP连接,浏览器也严格将连接升级到HTTPS。

HSTS

HSTS是一种可选的安全增强策略,已经由IETF RFC6797中指定。

服务端通过Strict-Transport-Security响应头来通知客户端应用HSTS协议:

Strict-Transport-Security: max-age=31536000; includeSubDomains

若浏览器认可该响应头:

  • 浏览器为该域名存储(阻止请求使用HTTP连接)这一约定,浏览器将强制所有请求通过 HTTPS
  • 浏览器阻止用户使用不安全/无效证书,会显示禁用提示(允许用户临时信任该证书)

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

  • 客户端必须支持 HSTS 协议
  • 必须要有一次成功的HTTPS请求,这样才能建立HSTS 策略

Preload HSTS

细心的你可能发现,HSTS还是存在一个薄弱漏洞,那就是浏览器没有当前HSTS信息,或者第一次访问;或者新操作系统,浏览器重装,清除浏览器缓存;HSTS信息的max-age过期;

依然需要一次明文HTTP请求和重定向才能升级到HTTPS并刷新HSTS信息,

这一次依然给攻击者可乘之机,针对以上攻击,HSTS的应对办法是在浏览器内置一个域名列表,这个列表内域名,浏览器都会使用HTTPS发起连接,这个列表由Chrome维护,主流浏览器均在使用。

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

inclueSubDomains 是可选参数,告知浏览器将HSTS策略用到当前域的子域。

Nginx启用HSTS

在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服务器,相关配置可参考AddHsts()的lambda参数:

  • 为STS header设置preload参数,Preload不是RFC HSTS规范的一部分,但是浏览器支持在全新安装时预加载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("www.example.com");
    });

    services.AddHttpsRedirection(options =>
    {
        options.RedirectStatusCode = StatusCodes.Status307TemporaryRedirect;
        options.HttpsPort = 5001;
    });
}

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

  • localhost: IPv4回送地址
  • 127.0.0.1 IPv4回送地址
  • [::1] IPv6回送地址

这也是开发者在localhost:5001启动时抓不到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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-01-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 精益码农 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Preload HSTS
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档