【Netty】使用 SSL/TLS 加密 Netty 程序(二十)

news/2024/11/24 21:04:34/

文章目录

  • 前言
  • 一、SSL/TLS概述
  • 二、Sslhandler类

前言

回顾Netty系列文章:

  • Netty 概述(一)
  • Netty 架构设计(二)
  • Netty Channel 概述(三)
  • Netty ChannelHandler(四)
  • ChannelPipeline源码分析(五)
  • 字节缓冲区 ByteBuf (六)(上)
  • 字节缓冲区 ByteBuf(七)(下)
  • Netty 如何实现零拷贝(八)
  • Netty 程序引导类(九)
  • Reactor 模型(十)
  • 工作原理详解(十一)
  • Netty 解码器(十二)
  • Netty 编码器(十三)
  • Netty 编解码器(十四)
  • 自定义解码器、编码器、编解码器(十五)
  • Future 源码分析(十六)
  • Promise 源码分析(十七)
  • 一行简单的writeAndFlush都做了哪些事(十八)

今天数据隐私是一个十分关注的问题,作为开发人员,我们需要准备好解决这个问题。至少我们需要熟悉加密协议 SSL 和 TLS 等之上的其他协议实现数据安全。作为一个 HTTPS 网站的用户,你是安全。当然,这些协议是广泛不基于 http 的应用程序,例如安全SMTP(SMTPS)邮件服务,甚至关系数据库系统。

为了支持 SSL/TLS,Java 提供了 javax.net.ssl API 的类SslContext 和 SslEngine 使它相对简单的实现解密和加密。Netty 的利用该 API 命名 SslHandler 的 ChannelHandler 实现,有一个内部 SslEngine 做实际的工作。

一、SSL/TLS概述

SSL全称是Secure Sockets Layer,安全套接字层,它是由网景公司(Netscape)设计的主要用于Web的安全传输协议,目的是为网络通信提供机密性、认证性及数据完整性保障。如今,SSL已经成为互联网保密通信的工业标准。

SSL/TLS 位于TCP层和应用层之间,具体如下图所示:
在这里插入图片描述

二、Sslhandler类

Sslhandler 继承自 ByteToMessageDecoder 并实现了 ChannelOutboundHandler 接口,因此可以像其他 ChannelHandler 一样添加到 ChannelPipeline 中,下图展示了 SslHandler 数据流图。
在这里插入图片描述

  1. 加密的入站数据被 SslHandler 拦截,进行解密。
  2. 前面加密的数据被 SslHandler 解密后,原始数据入站。
  3. 原始数据经过 SslHandler。
  4. SslHandler 加密数据并它传递出站。

以下为一个 SslHandler 使用 ChannelInitializer 添加到 ChannelPipeline 的示例。

public class SslChannelInitializer extends ChannelInitializer<Channel> {private final SslContext context;private final boolean startTls;public SslChannelInitializer(SslContext context,boolean client, boolean startTls) {   //1this.context = context;this.startTls = startTls;}@Overrideprotected void initChannel(Channel ch) throws Exception {SSLEngine engine = context.newEngine(ch.alloc());  //2engine.setUseClientMode(client); //3ch.pipeline().addFirst("ssl", new SslHandler(engine, startTls));  //4}
}
  1. 使用构造函数来传递 SSLContext 用于使用(startTls 是否启用)。
  2. 从 SslContext 获得一个新的 SslEngine 。给每个 SslHandler 实例使用一个新的 SslEngine。
  3. 设置 SslEngine 是 client 或者是 server 模式。
  4. 添加 SslHandler 到 pipeline 作为第一个处理器。

在大多数情况下,SslHandler 将成为 ChannelPipeline 中的第一个 ChannelHandler 。这将确保所有其他 ChannelHandler 应用他们的逻辑到数据后加密后才发生,从而确保他们的变化是安全的。

SslHandler 有很多有用的方法,如下表所示。例如,在握手阶段两端相互验证,商定一个加密方法。你可以配置 SslHandler 修改其行为或提供 在SSL/TLS 握手完成后发送通知,这样所有数据都将被加密。 SSL/TLS 握手将自动执行。

姓名描述
setHandshakeTimeout(…) setHandshakeTimeoutMillis(…) getHandshakeTimeoutMillis()设置和获取超时,之后握手 ChannelFuture 被通知失败。setCloseNotifyTimeout(…) setCloseNotifyTimeoutMillis(…) getCloseNotifyTimeoutMillis()
握手未来()返回一个 ChannelFuture,一旦握手完成,就会收到通知。如果握手之前完成,它将返回一个包含上次握手结果的 ChannelFuture。
关闭(…)发送 close_notify 请求关闭并销毁底层 SslEngine。

http://www.ppmy.cn/news/101759.html

相关文章

Python绘图神器Plotly安装、使用及导出图像教程

1. Plotly安装 Plotly 是一个快速完善并崛起的交互式的、开源的绘图库库&#xff0c;Python 库则是它的一个重要分支。现已支持超过40种独特的图表类型&#xff0c;涵盖了广泛的统计、金融、地理、科学和三维用例。 Python 中可以使用 pip 或者 conda 安装 Plotly&#xff1a…

[WPA3认证][BUG]WPA3AP部分的4.8.2case测试失败分析

Log分析: 仪表log如下: 2023-02-22 14:03:09.487 - INFO - SNIFFER (192.168.250.203:9999) ---> sniffer_control_start,Program,WPA3,Filename,_SAE_482_step6,channel,44,bandwidth,20 内部测试sniffer Tag: HT Information (802.11n D1.10) Tag Number: HT Info…

音乐小白乐器选择,如何学一手才艺,推荐尤克里里

乐器难度说明 注意&#xff1a;这里的难度说明是音准的难度&#xff0c;就是能不能发出标准的声音 乐器按照演奏方式分类&#xff0c;分为 演奏方式乐器举例难度等级难度说明敲击木鱼&#xff0c;架子鼓&#xff0c;钢琴1敲击乐是音最准的&#xff0c;敲哪个地方就发什么音&…

前端数据可视化开发平台FlyFish数据源应用教程详解

介绍 飞鱼&#xff08;FlyFish&#xff09;是云智慧开源的一款免费的数据可视化编排平台。通过简易的方式快速创建数据模型&#xff0c;通过拖拉拽的形式&#xff0c;快速生成一套数据可视化解决方案。在飞鱼产品中可以通过直接连接 MySQL 、 Oracle 等数据库直接从数据源中获…

企业产品操作手册,真的很有必要吗?

产品操作手册是一种对于产品使用者而言非常重要的工具。它是一份向用户介绍产品使用方法和功能的文档&#xff0c;可以提供关于产品的详细信息&#xff0c;解答用户的疑问&#xff0c;并帮助用户快速上手使用产品。 产品操作手册的必要性&#xff1a; 一、提高用户使用体验 …

【SpringMVC】五、HttpMessage的四个基本常用注解

HttpMessageConverter HttpMessageConverter是报文请求信息转换器&#xff0c;其提供了将请求信息转换文Java对象以及将Java对象转换为相应信息的方法&#xff1a; RequestBody、ResponseBody、RequestEntity、ResponseEntity 带Request的是将请求转换为Java对象&#xff0c…

前人踩过的雷,绕过的弯,何必重蹈,前端学习路径方法分享题

今天我们一起来聊聊前端的学习路线与方法。 在上篇文章中&#xff0c;我和你简单回顾了前端行业的发展&#xff0c;到现在为止&#xff0c;前端工程师已经成为研发体系中的重要岗位之一。可是&#xff0c;与此相对的是&#xff0c;我发现极少或者几乎没有大学的计算机专业愿意…

PostgreSQL 索引的重要要点

PostgreSQL官方文档对索引的定义&#xff0c;非常简单明了&#xff1a;“索引是提高数据库性能的常见方式。索引使得数据库服务器能够比没有索引时更快地查找和检索特定行。但索引也会增加整个数据库系统的开销&#xff0c;因此应该合理使用。” 这个定义中的关键是最后一个词“…