1 Overview
我们都知道 Https
请求访问是安全的,因为通过 SSL
层加密,可以保证不被中间人攻击。所以一般而言,Web 服务应该只向公网暴露 Https
的端口。但是如果客户端客户端仍然是通过 Http
请求访问,我们需要有一个中间件,通过 Redirect
方式将其映射到 Https
服务的端口。而且还需要让客户端(浏览器)记住在接下来访问的时候,应该直接访问 Https
端口。
所以我们提供了两个中间件来完成这个工作 :
HttpsRedirctionMiddleware
HtsMiddleware
接下来我们看一下这两个中间件是怎么工作的。
2. HttpsRedirectionMiddleware
首先看一下 HttpsRedictionOptions
这个类
包含了两个属性
RedirectStatusCode
Response 返回的状态码,默认是307
HttpsPort
Https
服务选择的端口号
那么如果 HttpsPort
没有指定,该如何寻找呢?
步骤如下
- 如果
_config
中制定了HTTPS_PORT
或者ANCM_HTTPS_PORT
,则找到端口号 - 如果
FeatureCollections
中的ServerAddressFeature
中有Https
的端口,则选择这个端口。注意有多个端口,则仍然表示失败
现在所有的准备工作完毕,开始准备处理请求
- 如果是
https
请求,则继续处理 - 如果没有找到
Https
的端口,则继续处理 - 将原本的
host
和Https
的port
拼接成新的host
(注意,一般默认https
访问 443 端口,所以无需显示标记 - 接下来为
response
修改相应的内容:1) 重定向的地址;2)状态响应码;3)将重定向的地址放在Header
中;4)完成任务,不执行后续的中间件
3 HstsMiddleware
HTTP Strict-Transport-Security (HSTS)
是相应的 Header
中的一项,它可以让浏览器在访问这个站点的时候,请使用 Https
, 比如说
Strict-Transport-Security: max-age=31536000; includeSubDomains
max-age
表明浏览器记住这个站点的时间IncludeSubDomains
指定subdomain
也同样适用
所以 HstsOptions
指定了这些信息
注意 Preload
不是标准的一部分。
中间件处理的流程是这样
- 如果是非
Https
请求,则继续处理 - 如果
Host
在预定义列表中,比如localhost
, 则交给下一个处理 - 否则为请求的
Header
中添加Hsts
记录。