Netty实战应用学习笔记-中级拓展篇(十三)

「深入浅出Netty」不愧是阿里架构师,这篇Netty实战文档太实用 前言 什么是Netty? Netty是由JBOSS提供的一个java开源框架。 Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty是一个基于NIO的客户,服务器端编程框架,使用Netty可以确保你快速和简单的开发出一个网络应用,例如实现了某种协议的客户,服务端应用。 作为当前最流行的NIO框架,Netty在互联... 阅读详情

🔐 项目十三:SSL双向加密验证

项目概述

项目名称:itstack-demo-netty-2-13
核心功能:基于SSL实现信息传输过程中的双向加密验证
技术要点:SSL/TLS协议、证书生成、SslContext、双向认证

为什么需要这个项目?

实际问题:

  • 明文传输容易被窃听,数据不安全
  • 无法确认通信对方的身份(可能被冒充)
  • 数据在传输过程中可能被篡改
  • 金融、医疗等敏感数据需要加密传输

解决方案:

  • ✅ SSL/TLS加密:数据加密传输,防止窃听
  • ✅ 双向认证:客户端和服务端互相验证身份
  • ✅ 数据完整性:防止数据被篡改
  • ✅ 证书管理:使用CA证书,建立信任链

适用场景:

  • 金融系统(银行、支付系统)
  • 企业内部系统(微服务间通信)
  • 物联网(设备与服务器通信)
  • API网关(后端服务认证)
  • 敏感数据传输(医疗、政务系统)

核心问题

为什么需要SSL?

在网络通信中,如果不使用SSL,信息就是明文传输,容易被:

  1. 窃听 - 第三方可以获取通信内容
  2. 篡改 - 数据在传输过程中被修改
  3. 冒充 - 无法确认通信对方的身份

SSL/TLS协议 就是为了解决这三大风险而设计的!

核心知识点

1. SSL/TLS简介

SSL (Secure Sockets Layer - 安全套接层)
TLS (Transport Layer Security - 传输层安全)

关系:TLS是SSL的继任者,现在通常统称为SSL/TLS

作用:

  • 在传输层对网络连接进行加密
  • 提供数据完整性验证
  • 提供身份认证
2. 单向认证 vs 双向认证
类型认证方向应用场景
单向认证客户端验证服务端HTTPS网站(浏览器验证网站)
双向认证客户端和服务端互相验证企业内部系统、金融系统 ⭐
3. 证书生成步骤

需要的工具:OpenSSL

生成步骤:

  1. 生成服务端和客户端私钥
openssl genrsa -des3 -out server.key 2048
openssl genrsa -des3 -out client.key 2048
  1. 根据私钥生成CSR文件(证书签名请求)
openssl req -new -key server.key -out server.csr -config openssl.cnf
openssl req -new -key client.key -out client.csr -config openssl.cnf
  1. 生成CA证书(证书颁发机构)
openssl genrsa -out ca.key 2048
openssl req -new -x509 -days 3650 -key ca.key -out ca.crt
  1. 使用CA证书签发服务端和客户端证书
openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey ca.key -out server.crt
openssl x509 -req -days 3650 -in client.csr -CA ca.crt -CAkey ca.key -out client.crt
  1. 将私钥转换为PKCS#8格式(Netty需要)
openssl pkcs8 -topk8 -nocrypt -in server.key -out pkcs8_server.key
openssl pkcs8 -topk8 -nocrypt -in client.key -out pkcs8_client.key

最终需要的文件:

服务端:

  • server.crt - 服务端证书
  • pkcs8_server.key - 服务端私钥
  • ca.crt - CA证书(用于验证客户端)

客户端:

  • client.crt - 客户端证书
  • pkcs8_client.key - 客户端私钥
  • ca.crt - CA证书(用于验证服务端)
4. 客户端SSL配置
private void connect(String inetHost, int inetPort) throws SSLException {
    // 1. 加载客户端证书文件 ⭐
    File certChainFile = new File("...\\client.crt");        // 客户端证书
    File keyFile = new File("...\\pkcs8_client.key");        // 客户端私钥
    File rootFile = new File("...\\ca.crt");                 // CA证书
    
    // 2. 构建SSL上下文 ⭐
    SslContext sslCtx = SslContextBuilder.forClient()
        .keyManager(certChainFile, keyFile)    // 配置客户端证书和私钥
        .trustManager(rootFile)                // 配置信任的CA证书
        .build();
    
    // 3. 配置客户端
    Bootstrap b = new Bootstrap();
    b.group(workerGroup);
    b.channel(NioSocketChannel.class);
    b.handler(new MyChannelInitializer(sslCtx));  // 传入SSL上下文
    ChannelFuture f = b.connect(inetHost, inetPort).sync();
}
5. 客户端Pipeline配置
public class MyChannelInitializer extends ChannelInitializer<SocketChannel> {
    private SslContext sslContext;
    
    @Override
    protected void initChannel(SocketChannel channel) {
        // 1. 添加SSL Handler(必须是第一个!)⭐
        channel.pipeline().addLast(sslContext.newHandler(channel.alloc()));
        
        // 2. 其他处理器
        channel.pipeline().addLast(new LineBasedFrameDecoder(1024));
        channel.pipeline().addLast(new StringDecoder(Charset.forName("GBK")));
        channel.pipeline().addLast(new StringEncoder(Charset.forName("GBK")));
        channel.pipeline().addLast(new MyClientHandler());
    }
}
6. 服务端SSL配置
private void bing(int port) throws SSLException {
    // 1. 加载服务端证书文件 ⭐
    File certChainFile = new File("...\\server.crt");
    File keyFile = new File("...\\pkcs8_server.key");
    File rootFile = new File("...\\ca.crt");
    
    // 2. 构建SSL上下文 ⭐
    SslContext sslCtx = SslContextBuilder.forServer(certChainFile, keyFile)
        .trustManager(rootFile)                // 配置信任的CA证书
        .clientAuth(ClientAuth.REQUIRE)        // 要求客户端认证(双向认证)⭐
        .build();
    
    // 3. 配置服务端
    ServerBootstrap b = new ServerBootstrap();
    b.group(parentGroup, childGroup)
        .channel(NioServerSocketChannel.class)
        .childHandler(new MyChannelInitializer(sslCtx));
    ChannelFuture f = b.bind(port).sync();
}

ClientAuth选项:

  • ClientAuth.NONE - 不需要客户端认证(单向认证)
  • ClientAuth.OPTIONAL - 客户端认证可选
  • ClientAuth.REQUIRE - 必须客户端认证(双向认证)⭐
7. SSL握手流程
1. ClientHello
   客户端 → 服务端:支持的加密算法、SSL版本等
   
2. ServerHello + Certificate
   服务端 → 客户端:选择的加密算法、服务端证书
   
3. Certificate Request(双向认证)
   服务端 → 客户端:要求客户端发送证书
   
4. Client Certificate
   客户端 → 服务端:客户端证书
   
5. Certificate Verify
   双方验证证书有效性
   
6. Finished
   握手完成,开始加密通信

完整通信流程

客户端发送消息:"Hello Server"
   ↓
客户端SSL Handler加密
   ↓
网络传输(加密数据)
   ↓
服务端SSL Handler解密
   ↓
服务端业务Handler处理:"Hello Server"
   ↓
服务端发送响应:"Hello Client"
   ↓
服务端SSL Handler加密
   ↓
网络传输(加密数据)
   ↓
客户端SSL Handler解密
   ↓
客户端业务Handler处理:"Hello Client"

项目总结

核心技术:

  • ✅ SSL/TLS:加密传输、数据完整性、身份认证
  • ✅ 双向认证:客户端和服务端互相验证证书
  • ✅ 证书生成:使用OpenSSL生成CA证书、服务端证书、客户端证书
  • ✅ Netty集成:使用SslContext和SslHandler

关键点:

  • SslHandler必须在Pipeline的最前面
  • ClientAuth.REQUIRE表示双向认证
  • Netty需要PKCS#8格式的私钥

适用场景:

  • 金融系统(银行、支付系统)
  • 企业内部系统(微服务间通信)
  • 物联网(设备与服务器通信)
  • API网关(后端服务认证)
  • 敏感数据传输(医疗、政务系统)
bugstack虫洞栈 | netty4.1案例文章列表汇总,跟着案例学Netty itstack-demo-netty netty4.x案例 微信公众号:bugstack虫洞栈,欢迎您的关注&获取更多案例与源码!博客栈:https://bugstack.cn 本专题针对netty4.x分为从;基础入门篇(九篇)、中级拓展篇(八篇)、高级应用篇(三章),由浅入深实现netty服务功能,介绍netty如何从上手到实战。 基础入门篇(九篇) netty案例,netty4.1... 阅读详情

相关推荐

netty案例,netty4.1中级拓展篇一《Netty与SpringBoot整合》

前言介绍 在实际的开发中,我们需要对netty服务进行更多的操作,包括;获取它的状态信息、启动/停止、对客户端用户强制下线等等,为此我们需要把netty服务加入到web系统中,那么本章节介绍如何将Netty与SpringBoot整合。 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使...

bugstack虫洞栈 2642

Netty实战应用学习笔记-中级拓展篇(一)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 1072

netty案例,netty4.1中级拓展篇十三《Netty基于SSL实现信息传输过程中双向加密验证》

前言介绍 SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。 在实际通信过程中,如果不使用SSL那么信息就是明文传输,从而给非法分子一些可乘之机; 窃听风险[eavesdropping]:第三方可以获知通信内容...

bugstack虫洞栈 2551

Netty实战应用学习笔记-中级拓展篇(六)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 630

netty案例,netty4.1中级拓展篇五《基于Netty搭建WebSocket,模仿微信聊天页面》

前言介绍 本章节我们模仿微信聊天页面,开发一个基于Netty搭建WebSocket通信案例。Netty的应用方面非常广;聊天、MQ、RPC、数据等等,在5G到来的时候更加需要大量数据传输,Netty的应用也会更加广阔。 1、这个案例使用SpringBoot+Netty+WebSocket搭建功能。 2、使用Netty提供的HttpServerCodec、HttpObjectAggregator、...

bugstack虫洞栈 3072

netty案例,netty4.1中级拓展篇七《Netty请求响应同步通信》

前言介绍 在我们实现开发RPC框架的时候,需要选择socket的通信方式。而我们知道一般情况下socket通信类似与qq聊天,发过去消息,什么时候回复都可以。但是我们RPC框架通信,从感觉上类似http调用,需要在一定时间内返回,否则就会发生超时断开。这里我们选择netty作为我们的socket框架,采用future方式进行通信。 Dubbo:国内最早开源的 RPC 框架,由阿里巴巴公司开发并于...

bugstack虫洞栈 2265

Netty实战应用学习笔记-中级拓展篇(十二)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 1087

netty案例,netty4.1中级拓展篇三《Netty传输Java对象》

前言介绍 Netty在实际应用级开发中,有时候某些特定场景下会需要使用Java对象类型进行传输,但是如果使用Java本身序列化进行传输,那么对性能的损耗比较大。为此我们需要借助protostuff-core的工具包将对象以二进制形式传输并做编码解码处理。与直接使用protobuf二进制传输方式不同,这里不需要定义proto文件,而是需要实现对象类型编码解码器,用以传输自定义Java对象。 pro...

bugstack虫洞栈 2142

Netty实战应用学习笔记-中级拓展篇(九)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 1063

netty案例,netty4.1中级拓展篇十二《Netty流量整形数据流速率控制分析与实战》

作者:付政委 | 关注微信公众号:bugstack虫洞栈,获取专题案例源码 前言介绍 你是否使用过某盘,在前几年我们使用的时候速度飞快,上传下载嗖嗖嗖。但是近年来只要不办会员,速度慢的像蜗牛,当然人家也得赚钱我们能理解。那么这样的限速是怎么实现的呢,我们这个案例使用Netty的流量整形进行限速传输,测试过程中当你把流量整形功能去掉后你就是年费VIP。 流量整形(Traffic Shaping...

bugstack虫洞栈 3696

netty案例,netty4.1中级拓展篇四《Netty传输文件、分片发送、断点续传》

前言介绍 1、在实际应用中我们经常使用到网盘服务,他们可以高效的上传下载较大文件。那么这些高性能文件传输服务,都需要实现的分片发送、断点续传功能。 2、在Java文件操作中有RandomAccessFile类,他可以支持文件的定位读取和写入,这样就满足了我们对文件分片的最基础需求。 3、Netty服务端启动后,可以向客户端发送文件传输指令;允许接收文件、控制读取位点、记录传输标记、文件接收完成。 ...

bugstack虫洞栈 3229

Netty实战应用学习笔记-中级拓展篇(八)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 640

netty案例,netty4.1中级拓展篇二《Netty使用Protobuf传输数据》

前言介绍 在netty数据传输过程中可以有很多选择,比如;字符串、json、xml、java对象,但为了保证传输的数据具备;良好的通用性、方便的操作性和传输的高性能,我们可以选择protobuf作为我们的数据传输格式。目前protobuf可以支持;C++、C#、Dart、Go、Java、Python等,也可以在JS里使用。知识点;ProtobufDecoder、ProtobufEncoder、Pr...

bugstack虫洞栈 2080

Netty实战应用学习笔记-中级拓展篇(五)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 636

netty案例,netty4.1中级拓展篇八《Netty心跳服务与断线重连》

前言介绍 在我们使用netty中,需要监测服务是否稳定以及在网络异常链接断开时候可以自动重连。需要实现监听;f.addListener(new MyChannelFutureListener()) 环境准备 1、jdk1.8【jdk1.7以下只能部分支持netty】 2、Netty4.1.36.Final【netty3.x 4.x 5每次的变化较大,接口类名也随着变化】 代码示例 itstack-...

bugstack虫洞栈 2069

FPGA远程升级必备:STARTUPE2原语控制Flash的避坑指南

本文深入解析了FPGA远程升级中STARTUPE2原语的核心价值与配置策略,详细介绍了其在QSPI Flash接口设计中的应用。通过Vivado工具和原语控制,开发者可以高效实现安全可靠的远程固件升级,提升系统稳定性和升级效率。

k8l9m0n的博客 398

Netty实战应用学习笔记-中级拓展篇(七)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 322

Win11系统下Abaqus 2025子程序开发环境一站式配置指南

本文详细介绍了在Win11系统下配置Abaqus 2025子程序开发环境的完整流程,包括VS2022和Intel oneAPI的安装与优化,以及Abaqus 2025的目录规划与环境联调。通过避坑指南和实战案例,帮助用户高效完成开发环境配置,避免常见错误,提升工作效率。

weixin_28717431的博客 335

Netty实战应用学习笔记-中级拓展篇(三)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 306

esp32移植canopen协议栈(二)

本文续接上一篇文章,之前我们已经搭建好了esp32的开发环境,以及初始工程。接下来我们开始实现can驱动相关,以及使用c++封装can接口。本文使用esp32实现c++实现can驱动层的封装。下一步移植canopen!!!嘻嘻。

qq_50267418的博客 1909

SpringAi 通过大模型来实现调用自己的Api

摘要 本文介绍了如何利用Spring AI的Tools机制扩展大模型能力,实现业务系统集成。通过@Tool和@ToolParam注解定义工具方法,将订单查询和关闭功能暴露给大模型调用。关键实现包括:1)使用详细描述标注工具方法和参数;2)在ChatClient中注册工具服务;3)集成对话记忆保持上下文。该方法使AI具备操作业务系统的能力,形成"认知-决策-执行"闭环,大幅提升了模型在实际业务场景中的应用价值。

又要搬砖了 838

Netty实战应用学习笔记-中级拓展篇(二)

Netty实战应用学习笔记-中级拓展篇

java_rutu的博客 301

利用pytorch长短期记忆网络LSTM实现股票预测分析

长短时记忆网络(Long Short Term Memory Network, LSTM),是一种改进之后的循环神经网络,可以解决RNN无法处理长距离的依赖的问题,目前比较流行。LSTM主要就是加入了三个门控:第一个开关遗忘门:负责控制继续保存长期状态c;第二个开关输入门:负责控制把即时状态输入到长期状态c;第三个开关输出门:负责控制是否把长期状态c作为当前的LSTM的输出。

优快云 精品推荐 1万+
上一篇: Netty实战应用学习笔记-中级拓展篇(十二)
下一篇: Netty源码分析篇:Netty 中的 Channel
不早睡不改名@
博客等级 码龄5年 536粉丝 306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值