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

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

启用 HTTPS 还不够安全    


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


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


d159b5711bf77dbc5a17ececef8e9c1d.png


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


3e458d1853c8e71c1173f1b531fe2f6c.png


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的生产示例:


      66d911f975c4a10e297616e30a0d70c3.png


      + 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

      相关文章
      |
      4月前
      |
      开发框架 .NET C#
      ASP.NET Core Blazor 路由配置和导航
      大家好,我是码农刚子。本文系统介绍Blazor单页应用的路由机制,涵盖基础配置、路由参数、编程式导航及高级功能。通过@page指令定义路由,支持参数约束、可选参数与通配符捕获,结合NavigationManager实现页面跳转与参数传递,并演示用户管理、产品展示等典型场景,全面掌握Blazor路由从入门到实战的完整方案。
      431 6
      |
      开发框架 .NET 开发者
      简化 ASP.NET Core 依赖注入(DI)注册-Scrutor
      Scrutor 是一个简化 ASP.NET Core 应用程序中依赖注入(DI)注册过程的开源库,支持自动扫描和注册服务。通过简单的配置,开发者可以轻松地从指定程序集中筛选、注册服务,并设置其生命周期,同时支持服务装饰等高级功能。适用于大型项目,提高代码的可维护性和简洁性。仓库地址:<https://github.com/khellang/Scrutor>
      390 5
      |
      9月前
      |
      Go
      在golang中发起http请求以获取访问域名的ip地址实例(使用net, httptrace库)
      这只是追踪我们的行程的简单方法,不过希望你跟着探险家的脚步,即使是在互联网的隧道中,也可以找到你想去的地方。接下来就是你的探险之旅了,祝你好运!
      509 26
      |
      开发框架 .NET C#
      在 ASP.NET Core 中创建 gRPC 客户端和服务器
      本文介绍了如何使用 gRPC 框架搭建一个简单的“Hello World”示例。首先创建了一个名为 GrpcDemo 的解决方案,其中包含一个 gRPC 服务端项目 GrpcServer 和一个客户端项目 GrpcClient。服务端通过定义 `greeter.proto` 文件中的服务和消息类型,实现了一个简单的问候服务 `GreeterService`。客户端则通过 gRPC 客户端库连接到服务端并调用其 `SayHello` 方法,展示了 gRPC 在 C# 中的基本使用方法。
      338 5
      在 ASP.NET Core 中创建 gRPC 客户端和服务器
      |
      开发框架 算法 中间件
      ASP.NET Core 中的速率限制中间件
      在ASP.NET Core中,速率限制中间件用于控制客户端请求速率,防止服务器过载并提高安全性。通过`AddRateLimiter`注册服务,并配置不同策略如固定窗口、滑动窗口、令牌桶和并发限制。这些策略可在全局、控制器或动作级别应用,支持自定义响应处理。使用中间件`UseRateLimiter`启用限流功能,并可通过属性禁用特定控制器或动作的限流。这有助于有效保护API免受滥用和过载。 欢迎关注我的公众号:Net分享 (239字符)
      338 1
      |
      开发框架 缓存 .NET
      GraphQL 与 ASP.NET Core 集成:从入门到精通
      本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
      401 3
      mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
      mcr.microsoft.com/dotnet/core/aspnet:2.1安装libgdiplus
      194 1
      |
      开发框架 JavaScript 前端开发
      一个适用于 ASP.NET Core 的轻量级插件框架
      一个适用于 ASP.NET Core 的轻量级插件框架
      237 0
      |
      Web App开发 前端开发 Apache
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
      修改的ranger ui的admin用户登录密码时,需要在ranger的配置里把admin_password改成一样的,否则hdfs的namenode在使用admin时启动不起来,异常如下: Traceback (mos...
      1158 0
      |
      Web App开发 监控 前端开发
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html><head><meta http-equiv="Cont
      使用hive分析日志作业很多的时候,需要修改mysql的默认连接数 修改方法   打开/etc/my.cnf文件 在[mysqld]  中添加 max_connections=1000 重启mysql服务  service mysqld restart mysql>show variables like '%max_connections%'; 查看当前mysql的连接数方法 mysqladmin -uroot -p status 其中,Uptime:mysqld运行时间,单位秒。
      766 0