SNI生效条件 - 补充nginx-host绕过实例复现中SNI绕过的先决条件
文章目录
- 1.前置环境搭建
- 2.测试SNI生效条件(时间)
- 3. 证书对SNI的影响
- 3.1 双方使用同一个证书:
- 3.2 双方使用不同的证书与私钥
- 4. 端口号区分测试
- 4.1 端口号区分,证书区分:
- 4.2 端口号区分,证书不区分:
- 5.总结SNI运行机制
- 6. SNI机制绕过host头探究
- 6.1 端口相同的SSL虚拟主机
- 6.2 端口不同的SSL虚拟主机
- 6.3 小结
在先前的文章中,我们通过一些列分析,在一个LNMP架构下的站群系统中挖掘出了基于host字段进行注入的SQL注入漏洞。在解决HOST绕过问题时,我们给出了三种解决方案。冒号分割、双写host字段、利用SNI机制。
经过测试,冒号分割是可行的,双写host字段被高版本的nginx返回了400,无法使用。最后一个则是SNI机制。
SNI(Server Name Indication)定义在RFC 4366,是一项用于改善SSL/TLS的技术,在SSLv3/TLSv1中被启用。它允许客户端在发起SSL握手请求时(具体说来,是客户端发出SSL请求中的ClientHello阶段),就提交请求的Host信息,使得服务器能够切换到正确的域并返回相应的证书。
我们知道证书机制是为了加密通信流量,防止第三方窃听而存在的。而同一台主机配置多个网站时,会用到虚拟主机技术,每一个网站对应的证书也是不一样的。那么在用户与服务器第一次建立连接时,将使用哪一个证书进行通信呢?最初就是用的默认证书,而之后为了适应这样的需求,RFC推出了SNI机制,在TLS协议初期,即客户端发送自己的client hello报文时,就将host字段加入进去,以供服务器区分目的网站。选到对应的证书。
随后,证书就为客户端和服务器加密了通信内容,也就是说。后续的通信一旦发现是用某一个证书解密的。不需要再做判断,可以直接将数据报文交给对应的网站即可。也就是在建立了稳定的https通信之后,服务器中间件将不需要对host头进行解析,直接通过证书实现定向解析。
那么,我们会产生一系列思考。
第一:SNI机制会一直触发吗? 单https虚拟主机 —>多https虚拟主机
第二:控制证书为变量,测试证书对于流量解析的影响?—>证明是用证书私钥做流量区分的
第三:控制端口号为变量,测试端口号对于流量解析的影响?
1.前置环境搭建
既然如此我们就需要准备两套完整的nginx解析https虚拟主机进行测试。以及个服务器证书与私钥。
#1.双证书准备
#1.创建证书目录
[root@blackstone nginx]# mkdir certificate
[root@blackstone nginx]# cd certificate/#2.生成私钥 - 要求你输入这个key文件的密码。给nginx使用。每次reload nginx配置时候都要验证这个PAM密码。
openssl genrsa -des3 -out ssl.key 4096
openssl genrsa -des3 -out sslb.key 4096
#3.生成CA证书文件 -- 此处为了区分证书,我们只好开两份CA证书相当于两个机构的认证
openssl req -new -key ssl.key -out aaa.csr
openssl req -new -key sslb.key -out bbb.csr#4.利用CA证书签名生成服务器身份证书 - 证书签发有效期365天
openssl x509 -req -days 365 -in aaa.csr -signkey ssl.key -out aaa.crt
openssl x509 -req -days 365 -in bbb.csr -signkey sslb.key -out bbb.crt
#5.检查生成情况 - 此时包含我们自己的私钥,自己的证书.crt文件,以及csrCA证书
[root@blackstone certificate]# ll
total 32
-rw-r--r-- 1 root root 1895 Feb 10 23:34 aaa.crt
-rw-r--r-- 1 root root 1724 Feb 10 23:32 aaa.csr
-rw-r--r-- 1 root root 1907 Feb 11 00:52 bbb.crt
-rw-r--r-- 1 root root 1728 Feb 11 00:51 bbb.csr
-rw-r--r-- 1 root root 3311 Feb 11 00:50 sslb.key
-rw-r--r-- 1 root root 3311 Jan 11 21:24 ssl.key
网页部署
[root@blackstone www]# mkdir -p /var/www/aaa
[root@blackstone www]# mkdir -p /var/www/bbb
[root@blackstone www]# echo 'this is aaa.com' > /var/www/aaa/index.html
[root@blackstone www]# echo 'this is bbb.com' > /var/www/bbb/index.html
记得修改本机的host文件:C:\Windows\System32\drivers\etc
192.168.2.169 www.bbb.com
192.168.2.169 www.aaa.com
2.测试SNI生效条件(时间)
1.单个https虚拟主机
server {listen 443 ssl;server_name www.aaa.com;ssl_certificate /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key /usr/local/nginx/certificate/ssl.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /var/www/aaa;index index.html index.htm;}}
重启nginx,使用浏览器访问,进行抓包分析。
#后面的所有重启都建议直接把nginx关闭,彻底重启
[root@blackstone www]# /usr/local/nginx/sbin/nginx -s quit
Enter PEM pass phrase:
[root@blackstone www]# /usr/local/nginx/sbin/nginx
Enter PEM pass phrase:
可以看到,确实在client hello报文内部,有这个主机名被发送给服务器了。
故,发送主机名是高版本浏览器的自发行为,不需要任何激发条件。浏览器会主动发送server name 以支持SNI机制。即SNI机制无需配置,只要服务器支持,就可以使用。
3. 证书对SNI的影响
3.1 双方使用同一个证书:
server {listen 443 ssl;server_name www.aaa.com;ssl_certificate /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key /usr/local/nginx/certificate/ssl.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /var/www/aaa;index index.html index.htm;}}server {listen 443 ssl;server_name www.bbb.com;ssl_certificate /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key /usr/local/nginx/certificate/ssl.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /var/www/bbb;index index.html index.htm;}}
测试访问情况:
可以实现分流。
3.2 双方使用不同的证书与私钥
这时,我们尝试进行证书与私钥的区分配置:
server {listen 443 ssl;server_name www.aaa.com;ssl_certificate /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key /usr/local/nginx/certificate/ssl.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /var/www/aaa;index index.html index.htm;}}server {listen 443 ssl;server_name www.bbb.com;ssl_certificate /usr/local/nginx/certificate/bbb.crt;ssl_certificate_key /usr/local/nginx/certificate/sslb.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /var/www/bbb;index index.html index.htm;}}
再次测试访问效果:
[root@blackstone certificate]# /usr/local/nginx/sbin/nginx -s reload
Enter PEM pass phrase:
Enter PEM pass phrase:
各自可以收到各自的证书,建立各自的通信。
4. 端口号区分测试
4.1 端口号区分,证书区分:
server {listen 8443 ssl;server_name www.bbb.com;ssl_certificate /usr/local/nginx/certificate/bbb.crt;ssl_certificate_key /usr/local/nginx/certificate/sslb.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /var/www/bbb;index index.html index.htm;}}server {listen 8444 ssl;server_name www.aaa.com;ssl_certificate /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key /usr/local/nginx/certificate/ssl.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /var/www/aaa;index index.html index.htm;}
测试效果:
[root@blackstone certificate]# vim ../conf/nginx.conf
[root@blackstone certificate]# /usr/local/nginx/sbin/nginx -s reload
Enter PEM pass phrase:
Enter PEM pass phrase:
可以看到,证书已经分别发送给了两个虚拟主机客户端。实现流量区分
4.2 端口号区分,证书不区分:
server {listen 8443 ssl;server_name www.bbb.com;ssl_certificate /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key /usr/local/nginx/certificate/ssl.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /var/www/bbb;index index.html index.htm;}}server {listen 8444 ssl;server_name www.aaa.com;ssl_certificate /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key /usr/local/nginx/certificate/ssl.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /var/www/aaa;index index.html index.htm;}
中途效果不明显大家可以重启nginx服务,因为服务一直开着可能会有缓存文件。
[root@blackstone nginx]# /usr/local/nginx/sbin/nginx -s quit
Enter PEM pass phrase:
Enter PEM pass phrase:
[root@blackstone nginx]# /usr/local/nginx/sbin/nginx
Enter PEM pass phrase:
Enter PEM pass phrase:
再次测试查看效果:
服务端两次传递同一个证书,实现通信。实现完整的虚拟主机分流访问。
5.总结SNI运行机制
通过以上种种测试,我们发现,无论使相同端口号,证书不同。达到证书区分传递的效果。还是证书不同,端口号也不同实现测试环境下的虚拟主机配置。SNI始终都可以准确的找到目标主机,即使是在我们的证书相同的情况下。
其实这一点也不费解,我们回顾一下之前学过的TSL通信过程:
第一次握手:客户端发送协议版本号,随机数,支持套件
第二次握手:服务端发送随机数,版本号,确认支持套件。同时发送服务端证书表明自己的身份(相当于发了个身份证过去)。
第三次握手:客户端收到证书,进行身份验证,验证完毕后利用从证书内部取出的公钥加密传输一串新的随机数pre_master给服务端。此时,客户端,服务端都共享了三个随机数,客户端随机数、服务端随机数、pre_master。于是根据三个随机数双方可以计算出共同的加密对称密钥进行通信。生成完会话密钥后,客户端发一个「Change Cipher Spec」,告诉服务端开始使用加密方式发送消息。再发一个「Encrypted Handshake Message(Finishd)」消息,把之前所有发送的数据做个摘要,再用会话密钥(master secret)加密一下,让服务器做个验证,验证加密通信是否可用和之前握手信息是否有被中途篡改过。
第四次握手:服务器也是同样的操作,发「Change Cipher Spec」和「Encrypted Handshake Message」消息,如果双方都验证加密和解密没问题,那么握手正式完成。
最后就是用会话密钥进行双方的通信
也就是说,客户端服务器通信过程中的密钥是新协商出来的。具有唯一标识性的这样一个密钥。那么通过SNI机制在第一次客户端发送client hello包时就发送的server name 确定到底访问的哪一个虚拟主机。后面的通信,自然可以通过解密密钥寻找到对应的虚拟主机。以此完成完整的SNI机制。
实现了可以为不同的虚拟主机配置这个不同的服务器证书。
6. SNI机制绕过host头探究
这样一个绕过出现的环境就很明显了,必须是配置了SSL的nginx服务器。
之前有同学提出过疑问,认为仅仅配置一个443端口的虚拟SSL主机。难以区分到底是由于我们的请求被转移到了默认的443端口处理虚拟主机上,还是说我们成功绕过了这样一个检测机制呢?接着3.2的环境,我们对其进行进一步的测试:
6.1 端口相同的SSL虚拟主机
#注意那个server在上面,在配置文件里就默认的是默认虚拟主机server {listen 443 ssl;server_name www.bbb.com;ssl_certificate /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key /usr/local/nginx/certificate/ssl.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /var/www/bbb;index index.html index.htm;}}server {listen 443 ssl;server_name www.aaa.com;ssl_certificate /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key /usr/local/nginx/certificate/ssl.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /var/www/aaa;index index.html index.htm;}}
相同端口号,不同的证书条件下,修改了host文件后跳转到了默认的bbb.com虚拟主机上。绕过失效
6.2 端口不同的SSL虚拟主机
server {listen 443 ssl;server_name www.bbb.com;ssl_certificate /usr/local/nginx/certificate/bbb.crt;ssl_certificate_key /usr/local/nginx/certificate/sslb.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /var/www/bbb;index index.html index.htm;}}server {listen 8443 ssl;server_name www.aaa.com;ssl_certificate /usr/local/nginx/certificate/aaa.crt;ssl_certificate_key /usr/local/nginx/certificate/ssl.key;ssl_session_cache shared:SSL:1m;ssl_session_timeout 5m;ssl_ciphers HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers on;location / {root /var/www/aaa;index index.html index.htm;}}
访问效果:
再次进行测试:
这次没有在跳默认了,说明可行。
6.3 小结
SNI绕过host生效的条件其实就是单一端口下仅仅绑定一台SSL虚拟主机。因为我们在6.1中看到,端口相同时同一服务器绑定多台SSL主机时,所有的请求会交给默认页面。如果漏洞点在默认页面就好说,如果不在。就无法使用SNI进行绕过了。
但同时,如果服务器是单一的配置了一个443端口的ssl虚拟主机,那么将可以进行SNI机制的HOST头绕过。
相关文章:

SNI生效条件 - 补充nginx-host绕过实例复现中SNI绕过的先决条件
文章目录1.前置环境搭建2.测试SNI生效条件(时间)3. 证书对SNI的影响3.1 双方使用同一个证书:3.2 双方使用不同的证书与私钥4. 端口号区分测试4.1 端口号区分,证书区分:4.2 端口号区分,证书不区分:5.总结SNI运行机制6. SNI机制绕过…...

傻白探索Chiplet,Modular Routing Design for Chiplet-based Systems(十一)
阅读了Modular Routing Design for Chiplet-based Systems这篇论文,是关于多chiplet通信的,个人感觉核心贡献在于实现了 deadlock-freedom in multi-chiplet system,而不仅仅是考虑单个intra-chiplet的局部NoC可以通信,具体的一些…...

C语言静态库、动态库的封装和注意事项
1、动态库、静态库介绍 参考博客:《静态库和动态库介绍以及Makefile》; 2、代码目录结构和编译脚本 参考博客:《实际工作开发中C语言工程的目录结构分析》; 3、编写库的流程 (1)明确需求:需求是否合理、需求的使用场景、需求可能遇…...

MyBatis-Plus分页插件和MyBatisX插件
MyBatis-Plus分页插件和MyBatisX插件六、插件1、分页插件a>添加配置类b>测试八、代码生成器1、引入依赖2、快速生成十、MyBatisX插件1、新建spring boot工程a>引入依赖b>配置application.ymlc>连接MySQL数据库d>MybatisX逆向生成2、MyBatisX快速生成CRUD申明…...

年前无情被裁,面试大厂的这几个月…
2月份了,金三银四也即将来临,在这个招聘季,大厂也开始招人,但还是有很多人吐槽说投了很多简历,却迟迟没有回复… 另一面企业招人真的变得容易了吗?有企业HR吐槽,简历确实比以前多了好几倍&…...
基于Java的分片上传功能
起因:最近在工作中接到了一个大文件上传下载的需求,要求将文件上传到share盘中,下载的时候根据前端传的不同条件对单个或多个文件进行打包并设置目录下载。 一开始我想着就还是用老办法直接file.transferTo(newFile)就算是大文件,…...

KDS安装步骤
KDS kinetis design studio 软件 第一步官网(https://www.nxp.com/ 注册账号下载set成功下载软件。 随着AI,大数据这些技术的快速发展,与此有关的知识也普及开来。如何在众多网站中寻找最有价值的信息,如何在最短的时间内获得最新的技…...

JavaSE-线程池(1)- 线程池概念
JavaSE-线程池(1)- 线程池概念 前提 使用多线程可以并发处理任务,提高程序执行效率。但同时创建和销毁线程会消耗操作系统资源,虽然java 使用线程的方式有多种,但是在实际使用过程中并不建议使用 new Thread 的方式手…...

开源代码的寿命为何只有1年?
说实话,如果古希腊的西西弗斯是一个在2016年编写开源代码的开发者,那他会有宾至如归的感觉。著名的西西弗斯处罚,是神话流传下来的,他被迫推一块巨大的石头上山,当登顶之后,只能眼睁睁看着它滚下去…...
完善登录功能--过滤器的使用
系列文章目录 Spring Boot读取配置文件内容的三种方式 Spring Boot自动配置–如何切换内置Web服务器 SpringBoot项目部署 上述为该系列部分文章,想了解更多可看我博客主页哦! 文章目录系列文章目录前言一、创建自定义过滤器LoginCheckFilter二、在启动类…...
CSS基础:属性和关系选择器
字体属性 color 文本颜色 div{ color:red;} div{ color:#ff0000;} div{ color:rgb(255,0,0);} div{ color:rgba(255,0,0,.5);}font-size 文本大小 h1 {font-size:40px;} h2 {font-size:30px;} p {font-size:14px;}注意:chrome浏览器接受最小字体是12px font-we…...

设计模式:原型模式解决对象创建成本大问题
一、问题场景 现在有一只猫tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和tom猫属性完全相同的10只猫。 二、传统解决方案 public class Cat {private String name;private int age;private String color;…...

驱动开发(二)
一、驱动流程 驱动需要以下几个步骤才能完成对硬件的访问和操作: 模块加载函数 module_init注册主次设备号 <应用程序通过设备号找到设备>驱动设备文件 <应用程序访问驱动的方式> 1、手动创建 (mknod)2、程序自动创建file_oper…...
《狂飙》大结局,这22句经典台词值得细品
最近爆火的热播剧《狂飙》大家都看了吗? 剧情紧凑、演技炸裂、豆瓣评分9.0,可以说是开年评分最高的一部国产剧。 虽然大结局了。 里面有很多经典台词,值得每个人细细品味。 01 这世界不缺梦想 有本事你就去实现它 02 你这么善良 怎么跟坏…...

【计算机网络期末复习】第二章 物理层
✍个人博客:https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 📣专栏定位:为想复习学校计算机网络课程的同学提供重点大纲,帮助大家渡过期末考~ 📚专栏地址: ❤️如果有收获的话,欢迎点…...

多核异构核间通信-mailbox/RPMsg 介绍及实验
1. 多核异构核间通信 由于MP157是一款多核异构的芯片,其中既包含的高性能的A7核及实时性强的M4内核,那么这两种处理器在工作时,怎么互相协调配合呢? 这就涉及到了核间通信的概念了。 IPCC (inter-processor communication contr…...
【Rust日报】2023-02-11 从头开始构建云数据库 RisingWave - 为什么我们从 C++ 转向 Rust...
GTK4发布v0.60gtk4-rs代码库包含GTK4的Rust crates。还有个庞大的GObject库生态系统,其中许多库基于gtk-rs中包含的Rust绑定工具。 特别是:gtk-rs-core,一些核心库的绑定,例如 glib、gio、pango、graphenegstreamer-rs,…...

Linux驱动开发(一)
linux驱动学习记录 一、背景 在开始学习我的linux驱动之旅之前,先提一下题外话,我是一个c语言应用层开发工作人员,在工作当中往往会和硬件直接进行数据的交互,往往遇到数据不通的情况,常常难以定位,而恰巧…...

Spring MVC 之返回数据(静态页面、非静态页面、JSON对象、请求转发与请求重定向)
文章目录1. 默认情况下返回静态页面2. 返回一个非静态页面的数据2.1 ResponseBody 返回页面内容2.2 RestController ResponseBody Controller3. 实现登录功能,返回 JSON 对象3.1 前端使⽤ ajax,后端返回 json 给前端3.2 前端发送 JSON 的标准格式4. 请…...

leetcode-每日一题-2335(简单,贪心)
自己打表看一下过程就可以发现,其实就是每次选两个大的进行--之后秒数加1即可现有一台饮水机,可以制备冷水、温水和热水。每秒钟,可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。给你一个下标从 0 开始、长度为 3 的整数数组 amount &am…...
SkyWalking 10.2.0 SWCK 配置过程
SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外,K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案,全安装在K8S群集中。 具体可参…...

springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...
Modbus RTU与Modbus TCP详解指南
目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...