深入理解SSLcontext和SSL/TLS 协议通信原理

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,双非大四,Java实习中…”);
📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正!共同进步,共同成长✊”);
🌟System.out.println(“💡如果文章对您有所帮助,希望您可以三连支持一下博主噢🔥”);
🌈System.out.println("🚀正在完成计划中:接下来的三个月里,对梦想的追逐 ");

SSL/TSL 协议通信原理

会话握手的四个阶段,"握手阶段"的所有通信都是明文的
image.png

  1. 客户端发出请求(ClientHello):客户端(通常是浏览器、sso的客户端)先向服务器发出加密通信的请求,这被叫做ClientHello请求。在这一步,客户端主要向服务器提供以下信息
  • 产生一个随机数,这个随机数一方面需要在客户端保存,另一方面需要传送给服务端

    1. 支持的协议版本,比如TLS 1.2版。
    2. 一个客户端生成的随机数,稍后用于生成"对话密钥"。
    3. 支持的加密方法,比如RSA公钥加密。
    4. 支持的压缩方法。

注意: 客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站,否则会分不清应该向客户端提供哪一个网站的数字证书。这就是为什么通常一台服务器只能有一张数字证书的原因。

  1. 服务器回应(SeverHello):服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容。
  • 服务端也需要产生一个随机数发送给客户端。客户端和服务端都需要使用这两个随机数来产生 Master Secret

    1. 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
    2. 一个服务器生成的随机数,稍后用于生成"对话密钥"。
    3. 确认使用的加密方法,比如RSA公钥加密。
    4. 服务器证书。(如X509)
    5. 索要客户端证书(非必须),银行金融系统会需要,其它很少有网点会索取
  1. 客户端回应:客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。
    1. 一个随机数。该随机数用服务器公钥加密,防止被窃听。
    2. 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
    3. 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。

上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master key"。有了它以后,客户端和服务器就同时有了三个随机数【三个随机数通过一个密钥导出器最终导出一个对称密钥。安全性】,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。

  1. 服务器的最后回应:服务器收到客户端的第三个随机数 pre-master key 之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息。
    1. 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
    2. 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。

SSLContext

SSLContext SSL SSLv3 TSL TSLv1.2等协议版本解释
这里先梳理一下SSL/TSL 协议通信原理
第一次会话:客户端告诉服务端我支持的【协议版本、加密算法、压缩算法】并生成一个随机数
第二次会话:服务端根据客户端发过来的信息确认要使用的【协议版本、加密算法、压缩算法】并生成一个随机数
第三次会话:客户端生成一个随机数对消息编码加密(会话密钥 改变编码格式),并把改随机数告诉服务端。客户端握手完成
第四次会话:服务端收到客户端发来的随机数,生成
会话密钥
对消息编码加密(改变编码格式)。服务端握手完成
整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。

SSLContext.getInstance("SSL");
SSLContext.getInstance("SSLv2");
SSLContext.getInstance("SSLv3");

SSLContext.getInstance("TLS");
SSLContext.getInstance("TLSv1");
SSLContext.getInstance("TLSv1.1");
SSLContext.getInstance("TLSv1.2");

image.png

关于SSL/TSL兼容性问题

客户端发送支持的最大版本;服务器选择将使用的版本,并将其发送到客户端。
要使握手成功,必须有一个客户端和服务器都支持的协议版本。如果客户端仅支持 SSL 3.0,而服务器仅支持 TLS 1.2 ,则没有通用协议版本,并且不会发生通信。
对于 Java 实现的所有协议(protocol)(SSLv3 和三个 TLS) 客户端声明它支持的_最大_协议(protocol)版本,服务器选择它自己的_最大_或客户端提供的较低者, 给出双方都支持的最高版本。如果客户端提供的最大值对于服务器而言低得无法接受,则服务器会拒绝该问候。 如果服务器选择的最大值对于客户端而言低得无法接受,则客户端中止握手。特别是 Java 客户端会抛出类似“不允许使用服务器协议(protocol) x”的异常,并且套接字未连接。

SSL/TSL兼容性的测试结果

如何进行SSL/TSL的测试

客户端SSL/TSL版本客户端发送数据时支持的版本服务端SSL/TSL版本及测试结果
SSLv3TLSv1TLSv1 TLSv1.1 × TLSv1.2 ×
SSLTLSv1、TLSv1.1、TLSv1.2TLSv1 TLSv1.1 TLSv1.2
TLSv1TLSv1TLSv1 TLSv1.1 × TLSv1.2 ×
TLSv1.1TLSv1、TLSv1.1TLSv1 TLSv1.1 TLSv1.2 ×
TLSv1.2TLSv1、TLSv1.1、TLSv1.2TLSv1 TLSv1.1 TLSv1.2
TLSTLSv1、TLSv1.1、TLSv1.2TLSv1 TLSv1.1 TLSv1.2

最后

慢慢的来,别着急!学会有质量的走过每一步


我是代码不会敲的小符,希望认识更多有经验的大佬,也在努力摸索出自己的道路
欢迎添加小符微信:A13781678921,一起加油

  • 27
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Netty是一款高性能的网络应用框架,支持SSL/TLS加密来保护网络通信的安全性。SSL(Secure Sockets Layer)和TLS(Transport Layer Security)是网络通信中广泛使用的加密协议,用于在客户端和服务器之间建立安全的通信信道。 Netty提供了一些组件和类来实现SSL/TLS加密。首先,我们需要使用javax.net.ssl包中的类来创建SSLContext对象。SSLContextSSL/TLS协议的入口点,它包含用于加密和解密数据的加密算法和密钥。我们需要为SSLContext对象配置密钥库和信任库,密钥库用于存储证书和私钥,而信任库用于存储可信的证书。 接下来,我们需要创建SslHandler对象,将其添加到Netty的ChannelPipeline中。SslHandler作为一个ChannelHandler,负责处理SSL/TLS握手过程和数据的加密解密。当建立连接时,SslHandler会自动执行握手过程,包括协商加密算法、验证证书以及生成会话密钥等。 一旦握手完成,SslHandler会将数据加密后发送到网络,并将接收到的密文解密成明文。这样可以确保在网络传输过程中的数据保密性和完整性。此外,SslHandler还提供了一些方法来获取会话信息,如远程主机的证书和协商的加密算法。 使用Netty的SSL/TLS加密功能能够有效地提高网络通信的安全性。通过配置SSLContext和添加SslHandler,我们可以方便地实现对网络通信的加密和解密。无论是在客户端还是服务器端,都可以使用Netty的SSL/TLS加密功能来保护数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码不会敲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值