所有文章 > 技术杂货铺 > Kotlin HTTP严格传输安全指南:它是什么以及如何启用它
Kotlin HTTP严格传输安全指南:它是什么以及如何启用它

Kotlin HTTP严格传输安全指南:它是什么以及如何启用它

鉴于网络上存在大量有关安全和漏洞缓解主题的资源库,找到有关网络上几乎所有漏洞的文章并不奇怪。注入、脚本、网络钓鱼,应有尽有。毫无疑问,这些都已被广泛探索和撰写。

然而,安全和漏洞缓解领域每天都在不断发展。因此,继续探索它们变化的不同方式及其对我们平台的影响至关重要。

本文旨在研究 HTTP 严格传输安全性 (HSTS),并简要但全面地分析它如何保护我们的用户免受不良行为者的侵害。我们将首先简要定义什么是 HSTS,以及是什么使其成为服务器和客户端之间安全通信的基本组成部分。之后,我们将研究如何在 Kotlin 上启用此安全功能。最后,我们将回顾实施过程中可能出现的一些问题。

值得注意的是,本文假设您精通 Kotlin Spring Boot。但是,如果您对此开发堆栈的熟练程度有限,或者您只是初涉其中,我们建议您访问Spring 的教程并熟悉它。对这些技术有基本的了解对于理解我们在本文中探讨的概念至关重要。

启动 Kotlin 和 Spring Boot 项目

在讨论严格传输安全之前,我们必须设置示例项目。我们将遵循上面分享的 Spring Boot 介绍文章中使用的示例项目的相同结构和模式,因此如果您花时间查看,则可以跳过此部分。

为了简化流程,我们首先访问https://start.spring.io并设置我们的启动项目。在下载 zip 文件之前,请记住选择Kotlin作为语言以及Spring WebSpring Security依赖项。

完成此操作并下载模板项目后,转到src/main/kotlin/com/example/blog文件夹并创建一个名为HtmlController.kt的类文件。我们将项目命名为“Blog”,但您可以随意命名。

在其中,只需输入以下代码:

package com.example.blog

import org.springframework.stereotype.Controller
import org.springframework.ui.Model
import org.springframework.ui.set
import org.springframework.web.bind.annotation.GetMapping

@Controller
class HtmlController {
@GetMapping("/")
fun blog(model: Model): String {
model["title"] = "Blog"
return "blog"
}
}

现在,转到src/main/resources/templates文件夹并创建页眉和页脚模板文件。我们为模板选择了mustache模板语法,但您可以按照自己喜欢的语法制作它们。

header.mustache
<html>
<head>
<title>{{title}}</title>
</head>
<body>
footer.mustache
</body>
</html>

最后,创建blog.mustache模板文件并添加以下 HTML:

blog.mustache
{{> header}}

<h1>{{title}}</h1>

<p>This is a test blog.</p>

{{> footer}}

好了,这就是您所需要的。现在,您可以在终端中输入“gradle bootRun”来运行代码,然后转到 localhost:8080 查看您的网站。

Kotlin HTTP 严格传输安全指南:它是什么以及如何启用它 图片

简单的博客页面。

瞧!

如果您想更简洁地了解项目进展情况,请探索 Kotlin 社区和Spring Boot 教程。

什么是 HTTP 严格传输安全?

现在我们有一个使用 Kotlin 和 Spring Boot 运行的基本网站,让我们来谈谈 HTTP 严格传输安全。

自诞生之日起,加密就一直是防止数据窃听的灵丹妙药。因此,保证使用适当的协议加密我们的交易对于任何网络平台提供安全性都至关重要。尽管网络依赖 SSL/TLS 协议来加密和保护客户端和服务器之间的交易,但确保所有交易都受到保护却完全不同。 

让我们用一个基本场景来说明一下。

网站与用户之间的典型通信流程首先需要向域发出 HTTP 请求。然后,如果相关服务器使用有效证书实施 SSL/TLS 并强制执行 HTTPS 重新路由,则用户将被重定向 (301) 到具有 HTTPS 请求的同一站点。此流程可确保客户端与服务器之间的所有通信都通过加密安全完成。

但事实并非如此。

请考虑以下场景。

MITM 攻击

毫无戒心的用户试图访问我们的网站,试图通过受感染的网络(伪装成合法的假冒接入点)访问我们的服务器。在这种情况下,初始握手可能会以以下方式使受害者面临漏洞。 

  1. 攻击者拦截客户端和服务器之间的通信,充当“中间人”。
  2. 然后,攻击者将他们与受害者之间的所有交易重写为未加密的。
  3. 因此,攻击者和服务器之间的所有交易都保持加密,从而误导服务器认为受害者受到了保护。
  4. 同时,攻击者将受害者发送到我们服务器的所有数据进行交叉。
  5. 利润。

我们刚刚解释的这种攻击称为 SSL 剥离。它的工作原理是允许攻击者充当通信中介。然后攻击者可以指定受害者的安全协议,基本上剥夺客户端的任何加密安全性。

不太好。那我们能做什么呢?

那么,这次攻击中最关键的一步当然是受害者在开始时进行的初次握手。 

要防止漏洞发生,需要确保浏览器仅使用加密方式与我们的服务器通信。而做到这一点的最佳方式就是明确地告诉浏览器这样做。 

这个流程本质上就是 HTTP 严格传输安全的含义,它是网络安全的基石。

缓解漏洞

在大多数情况下,浏览器及其包含的安全功能为我们承担了大部分繁重的工作,以确保用户的安全。要使用 HSTS 实现必要的安全保护,我们需要做的就是将以下标头添加到服务器响应中:

Strict-Transport-Security: max-age=31536000 ; includeSubDomains

HSTS 标头包含三个指令(一个必需,两个可选)。

  • max-age:这表示浏览器将遵守该政策的时间长度。我们已将值设置为 31536000,相当于一年。您可以输入任何您认为合适的值,但请记住,一旦浏览器收到 HSTS 政策,如果您的 SSL 证书出现问题,客户端将无法访问您的网站。
  • includeSubDomains:这是一个可选指令,用于说明子域是否需要遵守该政策。假设您拥有一个带有 SSL 证书的 mywebsite.com,并且您为访问它的客户端设置了标头。这意味着 www.mywebsite.com 和 subdomain.mywebsite.com 也需要遵循相同的 HSTS 政策。
  • preload:此可选指令表示您希望将您的网站添加到浏览器自带的 HSTS 预加载列表中。此列表实质上是告诉您的网站永久遵循该客户端的 HSTS。

值得庆幸的是,Spring Security 依赖项默认包含此标头。但是,如果您想自己动手或对标头进行一些修改,您可以执行以下操作:

修改<hsts>元素如下:

<http>
<!-- ... -->

<headers>
<hsts
include-subdomains="true"
max-age-seconds="31536000" />
</headers>
</http>

类似地,您可以通过在配置文件中添加以下内容仅使用 HSTS:

@EnableWebSecurity
public class WebSecurityConfig extends
WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http
// ...
.headers()
.httpStrictTransportSecurity()
.includeSubdomains(true)
.maxAgeSeconds(31536000);
}
}

此外,我们建议您在所有交易中强制使用 HTTPS。要在 Spring Boot 中实现此目的,请将以下内容添加到配置文件中:

server.port=8443
server.ssl.key.alias=demo-https
server.ssl.key-store-type=pkcs12
server.ssl.key-password=PASSWORD
server.ssl.key-store=classpath:demo-https.pkcs12

之后,确保创建适当的证书并将其包含在资源文件夹中。

最后,确保我们理解 HSTS 标头很重要,但我们还必须意识到那些尚未准备好遵守该政策的网站会发生什么。

Kotlin HTTP 严格传输安全指南:它是什么以及如何启用它 图片

浏览器错误。

我们可以看到,一个错误导致我们的浏览器无法显示该页面。该错误表明服务器将此网站列为仅使用加密。然而,浏览器检测到了一些可疑的东西。

解码 HSTS 错误

通过阅读错误,我们可以了解问题的可能来源是什么。 

  • 攻击者可能试图冒充服务器。
  • Wi-Fi 登录屏幕可能会导致加载过程出现问题。
  • 服务器没有正确的 SSL/TLS 配置。

我们知道我们故意让网站无法通过 HSTS 政策检查。这意味着我们的下一步应该是确保正确设置加密。此外,如果我们是第一次部署 HSTS,我们必须有一个适当的实施计划。

根据Scott Helme 的 HSTS 教程中的一些内容,下面是需要遵循的步骤清单。

  1. 查找属于您网站的所有子域名(查阅您的 DNS CNAME 条目)。这些子域名可能属于第三方服务。
  2. 检查根域和所有子域是否可以通过 HTTPS 访问。
  3. 确认您已配置正确的 HTTP 到 HTTPS 重定向。
  4. 选择较短的过期时间。例如,您可以设置“max-age=300”(即五分钟)。
  5. 如果必要的话,附加includeSubDomains指令。
  6. 分阶段增加max-age。争取有效期为两年。
  7. 一旦一切看起来良好,请添加预加载指令。
  8. 虽然这是可选的,但您可以将域名提交到 Google 的 HSTS 预加载列表。这将确保主流网络浏览器的未来版本会预加载您的域名并将其标记为“仅安全”。

按照这些步骤操作后,您将拥有一个仅强制使用 HTTPS 通信的网站。从那时起,所有用户都将遵守该政策。

继续前进

如今,加密是我们抵御攻击者和恶意攻击的最重要保护手段。然而,正如我们已经知道的,没有绝对的解决方案,仍然有可能遭到高度复杂的攻击。无论如何,实施 SSL/TLS 和 HSTS 政策对于保护几乎所有网络都相当有效。

文章来源:Kotlin HTTP Strict Transport Security Guide: What It Is and How to Enable It

#你可能也喜欢这些API文章!