2024年七大最佳免费货币转换API
.NET HTTP 严格传输安全指南:是什么及如何启用
在过去的几十年里,为我们的平台实施复杂的规则和缓解政策已经成为必要。
如今的网络已经发生了巨大的变化。当然,我们不敢说网络 100% 安全,可以抵御每天出现的威胁。
尽管如此,安全社区仍在努力使网络上的安全措施更加强大,并有效地抵御这些威胁。然而,并非所有安全措施都是一样的。例如,保护我们用户的基本功能之一是 HTTP 严格传输安全 (HSTS)。
本文的目标是探索 HSTS 的概念。
我们将简要定义什么是 HSTS 以及它如何成为服务器和客户端之间安全通信的基础,探讨如何实现此安全功能,并回顾可能出现的一些复杂情况。
最后,您应该了解什么是 HSTS 以及如何将其合并到您的项目中。
注意:本文面向 .NET 开发人员,因此我们将探讨如何在 ASP.NET Core 开发堆栈上实现 HSTS 解决方案。这意味着,要充分利用本文,您需要具有使用 C# 和 ASP.NET 的经验。
如果您对 HSTS 的总体概念感兴趣,我们建议您查看我们关于您喜欢的技术堆栈的其他文章。
解决了这个问题之后,我们就开始吧。
解释 HTTP 严格传输安全
以下解释将是技术性的,并且在所有平台上都是相对标准的,但请耐心听我说。
自诞生以来,加密一直是保护数据免遭恶意用户攻击的第一道防线。因此,作为开发人员,我们的工作是确保我们网站上的所有交易都使用正确的协议进行加密。
虽然网络使用 SSL/TLS 协议加密并保护客户端-服务器交易,但您的交易是否受到保护则完全是另一回事。
标准沟通流程如下:
网站和用户之间的沟通流程首先需要向域发出 HTTP 请求。
然后,如果相关服务器使用有效证书实现 SSL/TLS 并强制执行 HTTPS 重新路由,则用户将被重定向(301)到具有 HTTPS 请求的同一站点。
此流程确保客户端和服务器之间的所有通信均通过加密安全完成。
但事实并非如此。
MITM 攻击
我们在之前的帖子中讨论过中间人(MITM)攻击,这里再回顾一下。
一个信任的用户试图通过受损的网络(伪装成合法的假冒接入点)访问我们的服务器,从而访问我们的网站。
在这种情况下,初次握手可能会以以下方式使受害者面临漏洞。
- 攻击者拦截客户端和服务器之间的通信,充当中间人。
- 然后,他将自己与受害者之间的所有交易重写为未加密状态。
- 因此,攻击者和服务器之间的所有交易都保持加密,从而误导服务器认为受害者受到了保护。
- 同时,攻击者将受害者发送到我们服务器的所有数据进行交叉。
- 利润。
这种攻击称为 SSL 剥离。它的工作原理是让攻击者充当通信中介。然后攻击者可以控制受害者的安全协议,基本上就是剥离客户端的所有加密安全性。
我们的选择
我们可以看到,这次攻击中最关键的一步是受害者一开始进行的初始握手。因此,为了防止这种攻击发生,我们需要确保用户的浏览器只使用加密与我们的服务器通信。而最有效的方法就是明确指示浏览器这样做。
这个流程本质上就是 HTTP 严格传输安全所代表的,它是网络安全的基石之一。
基础知识
现在所有的理论都已经讲完了,让我们来探索如何保护我们的网站安全。
好消息是,在大多数情况下,我们浏览器的内置安全功能可以帮到我们。要使用 HSTS 实现主要安全层,我们需要做的就是将以下标头添加到服务器响应中。
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
HSTS 标头包含三个指令,一个是强制的,两个是可选的。同样,如果您读过我们之前关于 HSTS 的帖子,您应该对这些指令很熟悉。
- max-age:这表示浏览器将遵守该政策的时间长度。请注意,我们将该值设置为 31536000,相当于一年。您可以输入任何您认为合适的值,但请记住,一旦浏览器收到 HSTS 政策,如果您的 SSL 证书出现问题,您的客户将无法访问您的网站。
- includeSubDomains:此可选指令指定子域是否需要遵守该政策。如果您拥有具有 SSL 证书的 mywebsite.com,并为访问它的客户端设置标头,则 www.mywebsite.com 和 subdomain.mywebsite.com 也需要遵循相同的 HSTS 政策。
- preload:此可选指令表示您希望将您的网站添加到浏览器包含的 HSTS 预加载列表中。此列表实质上确保您的网站永久遵循该客户端的 HSTS。
保护您的 ASP.NET Core 项目
您可以通过两种方式将 HSTS 标头添加到 ASP.NET 核心项目:
- 实现 HTTPS 重定向中间件 ( UseHttpsRedirection ) 将 HTTP 请求重定向到 HTTPS。
- 实现 HSTS 中间件 ( UseHsts ) 以向客户端发送 HTTP 严格传输安全协议 (HSTS) 标头。
要使用UseHttpsRedirection方法,请使用以下内容修改Program.cs文件:
app.UseHttpsRedirection();
此外,我们需要为中间件设置一个端口,以将不安全的请求重定向到 HTTPS。
如果没有可用的端口,页面将不会重定向到 HTTPS,并且中间件会记录警告“无法确定重定向的 https 端口”。
通过向appsettings.json文件添加以下指令,您可以轻松做到这一点。
{
"https_port": 443,
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
对于第二条路由,您可以在Program.cs文件中使用以下代码添加 HSTS 中间件。
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
builder.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");
});
当然,仅仅因为您知道如何将 HSTS 标头应用于页面并不意味着您的网站可以强制执行该政策。例如,如果您的网站与 HSTS 不兼容,您将收到以下消息:
我们可以看到,一个错误导致浏览器无法显示该页面。
尽管我们尝试访问的服务器表明通信是加密的,但我们的浏览器收到了一些可疑信息并切断了连接。
了解 HSTS 错误
一旦我们看到浏览器提供的错误信息,我们就可以了解问题的可能根源。
- 该可疑活动可能是来自试图冒充服务器的攻击者。
- WiFi 登录屏幕可能会干扰加载过程。
- 服务器没有正确的 SSL/TLS 配置。
我们的首要任务是确保正确设置加密。此外,如果我们是第一次部署 HSTS,我们必须有一个适当的实施计划。
根据Scott Helme的 HSTS 教程中的一些内容,下面是需要遵循的步骤清单。
- 查找属于您网站的所有子域名(查阅 DNS CNAME 条目)。请注意,它们可能属于第三方服务。
- 确认根域及其子域可通过 HTTPS 访问。
- 确保您配置了正确的 HTTP 到 HTTPS 重定向。
- 设置较短的过期时间。例如,max-age=300(5分钟)。
- 如果必要的话,附加includeSubDomains指令。
- 分阶段增加max-age。争取有效期为两年。
- 一旦一切顺利,添加预加载指令。
- 将您的域名提交到 Google 的 HSTS 预加载列表,这将确保所有主流浏览器的未来版本都会预加载您的域名并将其标记为仅安全。(可选)
完成所有这些步骤后,您将拥有一个仅强制使用 HTTPS 通信的站点。从那时起,所有用户都将遵守该政策。
关于 HSTS 的最终思考
在我们寻求为我们的应用程序实现可靠的安全层的过程中,必须做很多工作来提供必要的保证,以与我们的用户建立强大的信任度。
当今的网络已经将安全性和标准推向了极致,使得一些解决方案变得复杂且具有挑战性。
值得庆幸的是,实施 SSL/TLS 和 HSTS 策略非常简单,并且在很大程度上保护了大部分网络。
文章来源:.NET HTTP Strict Transport Security Guide: What It Is and How to Enable It