网络安全 | SNI介绍及F5中的配置应用

关注:CodingTechWork

SNI介绍

  SNI(Server Name Indication)是 TLS/SSL 协议中的一个重要扩展,旨在解决同一 IP 地址上托管多个网站时,如何选择正确的 SSL/TLS 证书进行加密通信的问题。SNI 通过在 TLS 握手初期传递客户端请求的主机名,使得服务器能够选择适当的证书进行加密通信。随着现代互联网环境中虚拟主机和多证书托管的普及,SNI 已成为实现安全通信的核心技术之一。

为什么需要 SNI?

  在传统的 SSL/TLS 协议中,客户端和服务器通过握手过程交换加密所需的密钥信息。然而,标准的 SSL/TLS 握手流程无法区分同一 IP 地址上托管的多个网站,导致服务器无法选择适当的 SSL/TLS 证书进行加密连接。这个问题尤其在共享 IP 地址的虚拟主机环境中非常突出。
  为了克服这一局限,SNI 被引入到 SSL/TLS 协议中。通过在握手阶段就将主机名传递给服务器,SNI 使得服务器能够根据客户端请求的域名来选择和返回正确的 SSL/TLS 证书,从而实现多个网站在同一 IP 上的安全通信。

SNI 的技术原理

  SNI 扩展是在 TLS/SSL 协议中的一部分,属于客户端发起的“ClientHello”消息扩展。在客户端与服务器的初始通信中,客户端会将请求的主机名通过 SNI 扩展传递给服务器。这样,服务器就能在接收到握手请求后,依据该主机名来选择适合的证书进行后续的加密通信。

SNI 的工作流程

sni工作流程

  1. 客户端请求:
    客户端通过发送“ClientHello”消息发起请求,其中包括了目标主机的主机名。这个主机名通过 SNI 扩展部分传递到服务器。

  2. 服务器响应:
    服务器根据客户端请求的主机名选择适当的 SSL/TLS 证书。如果服务器支持 SNI,它会根据主机名匹配证书,并在握手过程中返回给客户端。

  3. 证书交换:
    服务器将选定的证书链返回给客户端。客户端验证证书后,与服务器完成安全连接的建立,进行加密通信。

关键要点

  • 握手过程的影响:SNI 只在 TLS 握手的早期阶段传递主机名,后续的加密通信不受影响。
  • 客户端支持:客户端需要支持 SNI 扩展才能传递主机名信息。
  • 服务器配置:服务器需要配置多个证书,以便根据请求的主机名选择合适的证书。

Nginx如何配置 SNI

  假设我们有两个不同的域名 www.example1.comwww.example2.com,它们都托管在同一台服务器上,但每个域名需要使用不同的 SSL/TLS 证书。以下是一个基于 Nginx 配置 SNI 的简单示例:

# 配置用于 www.example1.com 的 SSL
server {listen 443 ssl;server_name www.example1.com;ssl_certificate /path/to/example1.com.crt;ssl_certificate_key /path/to/example1.com.key;# 其他配置...
}# 配置用于 www.example2.com 的 SSL
server {listen 443 ssl;server_name www.example2.com;ssl_certificate /path/to/example2.com.crt;ssl_certificate_key /path/to/example2.com.key;# 其他配置...
}

SNI 的应用场景

应用场景描述
虚拟主机托管SNI 是虚拟主机托管中的核心技术。当多个网站共享同一 IP 地址时,SNI 允许服务器根据不同的主机名选择不同的证书。这使得单一服务器可以承载多个 HTTPS 网站,而无需为每个网站分配独立的 IP 地址。
多证书管理对于托管多个域名且每个域名使用不同 SSL/TLS 证书的网站,SNI 提供了一种简便的管理方式。每个域名可以使用独立的证书,并且无需更改服务器 IP 地址即可实现 SSL 加密。
证书过渡与更新使用 SNI,可以实现平滑的证书过渡与更新。例如,在更换证书时,不需要更换 IP 地址,也不会中断现有服务。每个域名的证书可以独立更新,减少了对用户的影响。
负载均衡和反向代理SNI 也被广泛应用于负载均衡器和反向代理中。根据 SNI 中传递的主机名,负载均衡器可以将请求转发给不同的后端服务器。许多云平台和反向代理(如 AWS、Nginx)都支持基于 SNI 的证书选择和请求路由。

SNI 的局限性

局限性/挑战描述
老旧浏览器的兼容性SNI 在较旧的浏览器和操作系统(如 IE6 及以下版本)中可能不被支持。如果用户使用不支持 SNI 的客户端进行访问,可能会导致 SSL 握手失败,无法建立加密连接。
无法提供 IP 级别的隔离虽然 SNI 使得同一 IP 地址上可以托管多个证书,但它并未提供与使用独立 IP 地址相同的物理隔离。因此,SNI 依然是基于域名进行区分,无法实现像不同 IP 地址那样的隔离。
性能影响虽然 SNI 本身不会带来显著的性能开销,但在某些情况下,服务器需要管理多个证书,这可能导致配置和调试的复杂性增加,进而影响性能表现。

在 F5 BIG-IP 中配置 SNI 和 默认 SSL 配置文件

  当使用 SNI(Server Name Indication)时,默认 SSL 配置文件(Default SSL Profile)在没有找到匹配的 SNI 时起着重要作用。默认 SSL 配置文件是当没有匹配的 SNI 时所应用的回退配置文件,用来处理连接。

默认 SSL 配置文件在 SNI 中的关键概念

SNI 匹配

  当客户端通过 SSL/TLS 连接到服务器时,它会在握手过程中发送 SNI,以指示它请求的主机名。F5 BIG-IP 会使用该 SNI 来选择适当的 SSL 配置文件和相应的证书。

默认 SSL 配置文件

  如果没有 SNI,或者提供的 SNI 不匹配任何已配置的 SSL 配置文件,则使用 默认 SSL 配置文件 来处理连接。这确保即使 SNI 无法识别,客户端仍会收到有效的 SSL 证书。

配置步骤

1. 创建 SSL 配置文件(可选)

  首先,为每个通过 SNI 处理的域名创建单独的 Client SSL 配置文件。你可以为每个配置文件配置证书、加密算法等其他 SSL 设置。

2. 配置默认 SSL 配置文件

在 F5 中创建一个 默认 SSL 配置文件,当 SNI 无法匹配时使用该配置文件。

  • 转到 Local Traffic -> Profiles -> SSL
  • 点击 Create 创建一个新的 Client SSL Profile。
  • 为此配置文件分配一个默认证书,并配置必要的 SSL 设置(例如,选择默认证书)。

3. 将 SSL 配置文件分配给虚拟服务器

  为每个虚拟服务器分配 SNI 基础的 SSL 配置文件,这些配置文件会根据特定的主机名进行匹配。
  对于那些应该使用 默认 SSL 配置文件(即没有匹配 SNI 的虚拟服务器),确保该默认配置文件已应用。

  • 在创建或编辑虚拟服务器时,在 SSL Profile (Client) 部分,选择 Default SSL Profile 来处理未匹配的 SSL 连接。

4. 在虚拟服务器中配置 SNI

  要根据主机名配置 SSL 配置文件(基于 SNI),为每个虚拟服务器分配适当的 Client SSL Profile。如果这些虚拟服务器没有匹配的 SNI 配置文件,默认 SSL 配置文件 将会被应用。

5. 测试配置

  配置完成后,测试 SSL/TLS 连接。如果客户端发送的请求没有识别的 SNI 或者没有发送 SNI,默认 SSL 配置文件 将被使用,客户端将收到来自默认配置文件的证书。
你可以使用 curl 命令进行测试:

curl -v https://www.example.com

如果没有匹配的 SNI,该命令将触发使用默认 SSL 配置文件的证书。

配置示例

默认 SSL 配置文件

  • 转到 Local Traffic -> Profiles -> SSL -> Client
  • 创建一个 默认 SSL 配置文件 并分配默认的 SSL 证书。

特定域的 SNI 配置文件

  • 为每个特定的域名(例如 example1.com、example2.com)创建额外的 Client SSL 配置文件,每个配置文件都有其独立的 SSL 证书。

虚拟服务器的 SSL 配置文件分配

  • 为每个虚拟服务器分配合适的 Client SSL 配置文件,该配置文件基于 SNI 来匹配主机名。
  • 对于没有匹配的虚拟服务器,默认 SSL 配置文件 将处理 SSL 连接。

通过这种方式,可以清晰地了解如何在 F5 BIG-IP 中配置 SNI 和默认 SSL 配置文件,并确保在没有匹配的 SNI 时使用默认配置文件处理 SSL/TLS 连接。

总结

  SNI 是现代互联网中托管多个 HTTPS 网站的关键技术,它使得服务器能够根据客户端请求的主机名选择正确的 SSL/TLS 证书,解决了同一 IP 地址上多个网站的证书选择问题。随着网络托管技术的进步,SNI 将在虚拟主机、证书管理和安全通信等领域发挥越来越重要的作用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/16947.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM Cortex-M3/M4 权威指南 笔记【二】架构

一、架构 1.1 架构简介 Cortex-M3/M4 处理器都基于 ARMv7-M 架构。最初的 ARMv7-M 架构是随着 Cortex-M3 处理器一同引入的,而在 Cortex-M4 发布时,架构中又额外增加了新的指令和特性,改进后的架构有时也被称为 ARMV7E-M。要了解 ARM7-M 和…

LabVIEW软件需求开发文档参考

在项目开发的工作历程中,精准把握项目需求无疑是成功打造整个项目的首要关键步骤,同时也是一个至关重要且不可忽视的核心环节。明确且详尽的项目需求就如同建筑的基石,为后续的设计、开发、测试等一系列工作提供了坚实的支撑和清晰的指引。倘…

Linux内核实时机制x - 中断响应测试 Cyclictest分析1

Linux内核实时机制x - 中断响应测试Cyclitest 1 实时性测试工具 rt-test 1.1 源码下载 1.下载源码: ~/0-code/5.15$ git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git 正克隆到 rt-tests... remote: Enumerating objects: 5534, done. remot…

Unity 代码优化记录

文档 unity 代码优化分析:https://docs.unity3d.com/Manual/analysis.html Unity 修复性能问题:https://learn.unity.com/tutorial/fixing-performance-problems-2019-3?courseId5c87de35edbc2a091bdae346#604586d7edbc2a5b4345d249 实例 具体枚举转En…

Arcgis/GeoScene API for JavaScript 三维场景底图网格设为透明

项目场景: 有时候加载的地图服务白色区域会露底,导致在三维场景时,露出了三维网格,影响效果,自此,我们需要将三维场景的底图设为白色或透明。 问题描述 如图所示: 解决方案: 提示…

snort3.0-ubuntu18.04 64入侵检测安装与使用ailx10ailx10​​知乎知识会员

在日常生活中,很多人怀疑自己的手机、电脑被监控了,担心自己的隐私泄漏,实际上最佳的检测方式就是终端检测,也就是EDR,但是就是有那么多的人在网上大放厥词,说任何EDR杀毒软件都检测不到监控,毕…

AI语言模型的技术之争:DeepSeek与ChatGPT的架构与训练揭秘

云边有个稻草人-CSDN博客 目录 第一章:DeepSeek与ChatGPT的基础概述 1.1 DeepSeek简介 1.2 ChatGPT简介 第二章:模型架构对比 2.1 Transformer架构:核心相似性 2.2 模型规模与参数 第三章:训练方法与技术 3.1 预训练与微调…

AI赋能前端协作:效率提升与团队新动力

当前前端开发领域竞争激烈,项目交付周期紧迫,前端开发团队面临着诸多挑战。沟通成本高、代码规范不统一、开发效率低等问题,常常导致项目延期、质量下降,甚至团队士气低落。而AI代码生成器的出现,为解决这些问题带来了…

Django快速入门

1. 安装 在安装了python环境下,在命令行winr,录入 pip install django或者使用国内源下载 pip install -i https://pypi.douban.com/simple/ django安装完成后,在%python%/Scripts目录下会出现如下图的django-admin.exe的文件 以及django…

Windows可以永久暂停更新了

最终效果图: 第一步: winR组合键打开运行对话框,输入“regedit”,点击“确定”或回车: 第二步: 注册表定位到“\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings”,新建DWO…

在anaconda环境中构建flask项目的exe文件

一、创建并激活虚拟环境 conda create -n flask_env python3.9 # python版本根据项目需求安装 conda activate flask_env # 激活环境二、安装必要依赖 推荐使用conda,pip没尝试过,但是deepseek给出了命令 conda install flask …

C++ Primer 条件语句

欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…

微服务SpringCloud Alibaba组件nacos教程【详解naocs基础使用、服务中心配置、集群配置,附有案例+示例代码】

一.Nacos教程 文章目录 一.Nacos教程1.1 Nacos简介1.2 nacos基本使用直接下载打包服务源码方式启动 1.3 创建nacos客服端1.4 nacos集群配置1.5 nacos配置中心 1.1 Nacos简介 nacos是spring cloud alibaba生态中非常重要的一个组件,它有两个作用: 1:注册…

在 Navicat 17 中扩展 PostgreSQL 数据类型 - 范围类型

范围类型 PostgreSQL 是市场上最灵活的数据库之一,这已不是什么秘密。事实上,PostgreSQL 的可扩展性和丰富的功能集使 PostgreSQL 近期已超越 MySQL,成为最受开发人员推崇和最受欢迎的数据库系统。在这个使用 Navicat Premium 17 在 Postgre…

内容测试2

备注: 在7月10日记录之前遇到的问题及解决方法: 一:常见的访问问题: 403 Forbidden:(未有请求权限) 表示服务器理解请求但是拒绝执行它。这通常是由于服务器上的文件或资源没有正确的读、写或执行权限&…

安川伺服控制器MP系列优势特点及行业应用

在工业自动化领域,运动控制器的性能直接决定了设备的精度、效率和可靠性。作为全球领先的运动控制品牌,安川电机伺服控制器凭借其卓越的技术优势和广泛的应用场景,正在为智能制造注入强劲动力! MP3100:主板型运动控制…

kafka生产端之架构及工作原理

文章目录 整体架构元数据更新 整体架构 消息在真正发往Kafka之前,有可能需要经历拦截器(Interceptor)、序列化器(Serializer)和分区器(Partitioner)等一系列的作用,那么在此之后又会…

二、交换机的vlan子设备接入

一、交换机的vlan设置-CSDN博客 二、交换机的vlan子设备接入-CSDN博客 接上篇的文章,本文接入了子设备 网络结构如下: 用路由器A和POE交换机B代替第一篇中的笔记本电脑,路由器A和交换机B都关闭DHCP服务,并分别接入一个IPC&#…

DedeBIZ系统审计小结

之前简单审计过DedeBIZ系统,网上还没有对这个系统的漏洞有过详尽的分析,于是重新审计并总结文章,记录下自己审计的过程。 https://github.com/DedeBIZ/DedeV6/archive/refs/tags/6.2.10.zip 📌DedeBIZ 系统并非基于 MVC 框架&…

C语言基本概念————讨论sqrt()和pow()函数与整数的关系

本文来源:C语言基本概念——讨论sqrt()和pow()函数与整数的关系. C语言基本概念——sqrt和pow函数与整数的关系 1. 使用sqrt()是否可以得到完全平方数的精确的整数平方根1.1 完全平方数的计算结果是否精确?1.2 为什么不会出现误差(如 1.99999…