本文是《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 headerlocation / {root /usr/share/nginx/html;}# Because this 'location' block contains another 'add_header' directive,# we must redeclare the STS headerlocation /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年了,再不会Https就老了

ASP.NETCore编程实现基本认证

AspNetCore结合Redis实践消息队列

转载是一种动力,分享是一种美德    ~~..~~

如果你觉得文章还不赖,您的鼓励是原创干货作者的最大动力,让我们一起激浊扬清。

扫码

关注

HTTP Strict Transport Security (HSTS) in ASP.NET Core相关推荐

  1. HTTP严格安全传输(HTTP Strict Transport Security, HSTS)chromuim实现源码分析(一)

    // HTTP strict transport security (HSTS) is defined in // http://tools.ietf.org/html/ietf-websec-str ...

  2. html增加hsts头,开启HSTS(HTTP Strict Transport Security)

    开启HSTS(HTTP Strict Transport Security) HSTS(HTTP Strict Transport Security) 的作用就是,当你使用了一次之后,浏览器就会记住这 ...

  3. 为什么我们要使用HTTP Strict Transport Security?

    HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. 0×01. Freebuf百科: ...

  4. 渗透测试web未设置http头 Strict Transport Security

    HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. 0×01. Freebuf百科: ...

  5. HTTP Strict Transport Security 导致的307 http自动跳转https

    今天遇到一个 由于nginx设置了header:Strict-Transport-Security导致url自动跳转为https的问题. 记录如下: 开发者模式下可以看到307及hsts类提示信息 可 ...

  6. chrome去除htst_HTTP Strict Transport Security实战详解

    HTTP Strict Transport Security (通常简称为HSTS) 是一个安全功能,它告诉浏览器只能通过HTTPS访问当前资源, 禁止HTTP方式. 0×01. Freebuf百科: ...

  7. asp.net core 系列之Startup

    这篇文章简单记录 ASP.NET Core中 ,startup类的一些使用. 一.前言 在 Startup类中,一般有两个方法: ConfigureServices 方法: 用来配置应用的 servi ...

  8. 用ASP.NET Core 2.1 建立规范的 REST API -- 保护API和其它

    预备知识: 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 用ASP.NET Core 2.0 建立规范的 REST API -- 预备知识 (2) + 准备项目 建 ...

  9. ASP.NET Core MVC 项目 Autofac

    目录 一:基本使用 二:简单理解Autofac容器 三:多种注册方式 四:构造函数注入 一:默认构造函数注入 二:选择一个构造函数参数的构造函数 五:属性注入 一:属性注入 二:属性注入扩展--指定属 ...

最新文章

  1. 在读博士的第八年,她破解了量子计算领域最基本的问题之一
  2. 了解关于Hadoop的12个事实
  3. 多系统权限设计(一)
  4. 网页制作代码模板_科普:关于网页设计的4个基础小知识
  5. python格式化输出区别_python格式化输出的区别
  6. MyEclipse下开发Web Service(转)
  7. 谷歌修复十多个安卓高危漏洞
  8. 【Linux】Windows Ubuntu 双系统开机选择界面设置
  9. File类之常用方法
  10. Log4Net 之走进Log4Net (四)
  11. mybatisplus自动填充时间出现的问题
  12. C语言删除字符数组中指定的字符(C笔记)
  13. mysql多表in查询_MySQL多表查询
  14. SQL:2016标准之新特性
  15. re模块或正则表达式
  16. PX4的软件仿真(SITL)环境配置过程
  17. 苹果充电器怎么辨别真假_如何快速辨别苹果充电器数据线耳机等配件真假和是否正品问题...
  18. 前端面试题——浏览器原理 高频
  19. 如何下载jquery.js文件
  20. 2023年南京理工大学控制理论考研上岸前辈备考经验指导

热门文章

  1. .net Repeater知识知多少
  2. 十个必备的.NET开发小工具(1):Snippet Compiler
  3. tomcat学习笔记(JDK+TOMCAT+AXIS)
  4. 【小安翻唱】凉宫春日的忧郁--冒険でしょでしょ第五届外语歌曲大赛助兴节目~绫魂论坛送aya的生日礼物筹备开始~...
  5. SQL利用Case When Then多条件判断
  6. iphone解锁_有人可以用解锁的iPhone做的最糟糕的事情是什么?
  7. [置顶] C#中通过调用webService获取上网IP地址的区域的方法
  8. Optaplanner规划引擎的工作原理及简单示例(1)
  9. SpringMvc项目中使用GoogleKaptcha 生成验证码
  10. 黄聪:wordpress如何开启文章格式post format