当前位置: 首页 > news >正文

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

文章目录

  • 前言
  • 一、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.lryc.cn/news/90844.html

相关文章:

  • runway gen2
  • Day2:Windows网络编程-TCP
  • leetcode1985. 找出数组中的第 K 大整数
  • 基于深度学习的高精度野生动物检测识别系统(PyTorch+Pyside6+YOLOv5模型)
  • 从零开始 Spring Boot 35:Lombok
  • 深入解析Spring源码系列:Day 6 - Spring MVC原理
  • Cmake中message函数 如何优雅地输出
  • 人工智能基础部分20-生成对抗网络(GAN)的实现应用
  • JavaScript表单事件(上篇)
  • vb6 Webview2微软Edge Chromium内核执行JS取网页数据测速
  • 编码,Part 1:ASCII、汉字及 Unicode 标准
  • C++ Eigen库矩阵操作
  • Linux-0.11 boot目录bootsect.s详解
  • django组件552
  • 【枚举算法的Java实现及其应用】
  • linux led 驱动
  • 平面最近点对(分治算法)
  • 【基于前后端分离的博客系统】Servlet版本
  • 在线Excel绝配:SpreadJS 16.1.1+GcExcel 6.1.1 Crack
  • 一个轻量的登录鉴权工具Sa-Token 集成SpringBoot简要步骤
  • day 44 完全背包:518. 零钱兑换 II;377. 组合总和 Ⅳ
  • K8s in Action 阅读笔记——【5】Services: enabling clients to discover and talk to pods
  • 牛客网DAY2(编程题)
  • Java经典笔试题—day14
  • 一个帮助写autoprefixer配置的网站
  • C语言中的类型转换
  • String底层详解(包括字符串常量池)
  • C++ 里面lambda和函数指针的转换
  • 前端Rust开发WebAssembly与Swc插件快速入门
  • 【C++ 学习 ⑧】- STL 简介