1 Overview

我们都知道 Https 请求访问是安全的,因为通过 SSL 层加密,可以保证不被中间人攻击。所以一般而言,Web 服务应该只向公网暴露 Https 的端口。但是如果客户端客户端仍然是通过 Http 请求访问,我们需要有一个中间件,通过 Redirect 方式将其映射到 Https 服务的端口。而且还需要让客户端(浏览器)记住在接下来访问的时候,应该直接访问 Https 端口。

所以我们提供了两个中间件来完成这个工作 :

  1. HttpsRedirctionMiddleware
  2. HtsMiddleware

接下来我们看一下这两个中间件是怎么工作的。

2. HttpsRedirectionMiddleware

首先看一下 HttpsRedictionOptions 这个类

包含了两个属性

  • RedirectStatusCode Response 返回的状态码,默认是 307
  • HttpsPort Https 服务选择的端口号

那么如果 HttpsPort 没有指定,该如何寻找呢?

步骤如下

  1. 如果 _config 中制定了 HTTPS_PORT 或者 ANCM_HTTPS_PORT ,则找到端口号
  2. 如果 FeatureCollections 中的 ServerAddressFeature 中有 Https 的端口,则选择这个端口。注意有多个端口,则仍然表示失败

现在所有的准备工作完毕,开始准备处理请求

  1. 如果是 https 请求,则继续处理
  2. 如果没有找到 Https 的端口,则继续处理
  3. 将原本的 hostHttpsport 拼接成新的 host (注意,一般默认 https 访问 443 端口,所以无需显示标记
  4. 接下来为 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 不是标准的一部分。

中间件处理的流程是这样

  1. 如果是非 Https 请求,则继续处理
  2. 如果 Host 在预定义列表中,比如 localhost , 则交给下一个处理
  3. 否则为请求的 Header 中添加 Hsts 记录。
Feng Gao

Feng Gao

7 Followers

A software developer in Microsoft at Suzhou. Most articles spoken language is Chinese. I will try with English when I’m ready