SSL/TLS通信及其在Java中的实践

本文深入探讨SSL/TLS通信,从TLS的基本原理、证书管理到JDK的SSL支持,包括SSLSocket、SSLServerSocket、SSLContext、KeyManager和TrustManager等。讲解了在Java中如何实现SSL/TLS,涉及SSLEngine、NIO/AIO SSL Socket以及Netty的TLS支持,并提供了相关名词解释和性能优化建议。
摘要由CSDN通过智能技术生成


前言

SSL/TLS(SSL和TLS是一个东西不同时期叫法,后文统一使用TLS)问世已久,虽然已广泛应用在了目前的网络通信中,但笔者对其认识基本来源于早年学习网络知识时的灌输型记忆,模糊的知道是什么,但为什么却少有研究,恰巧最近需要应用这块知识,因此查了不少资料,因此有了这边文章。主要包含TLS基本原理、证书、认证、JDK的支持、在Java中的实践等。


一、通信加密这件事

搞懂加密及SSL

二、了解TLS

有趣的讨论及文章:给面试官上课 TCP那些事儿

参考资料如下:
SSL/TLS、对称加密和非对称加密和TLSv1.3
SSL/TLS协议详解
证书及单双向认证
证书介绍

三、JDK如何对TLS提供支持?

JDK SSL包介绍
JDK证书管理
SSL包 javadoc

① 通信核心类——SSLSocket和SSLServerSocket。对于使用过socket进行通信开发的朋友比较好理解,它们对应的就是Socket与ServerSocket,只是表示实现了SSL协议的Socket和ServerSocket,同时它们也是Socket与ServerSocket的子类。SSLSocket负责的事情包括设置加密套件、管理SSL会话、处理握手结束时间、设置客户端模式或服务器模式。

② 客户端与服务器端Socket工厂——SSLSocketFactory和SSLServerSocketFactory。在设计模式中工厂模式是专门用于生产出需要的实例,这里也是把SSLSocket、SSLServerSocket对象创建的工作交给这两个工厂类。

③ SSL会话——SSLSession。安全通信握手过程需要一个会话,为了提高通信的效率,SSL协议允许多个SSLSocket共享同一个SSL会话,在同一个会话中,只有第一个打开的SSLSocket需要进行SSL握手,负责生成密钥及交换密钥,其余SSLSocket都共享密钥信息。

④ SSL上下文——SSLContext。它是对整个SSL/TLS协议的封装,表示了安全套接字协议的实现。主要负责设置安全通信过程中的各种信息,例如跟证书相关的信息。并且负责构建SSLSocketFactory、SSLServerSocketFactory和SSLEngine等工厂类。

⑤ SSL非阻塞引擎——SSLEngine。假如你要进行NIO通信,那么将使用这个类,它让通过过程支持非阻塞的安全通信。

⑥ 密钥管理器——KeyManager。此接口负责选择用于证实自己身份的安全证书,发给通信另一方。KeyManager对象由KeyManagerFactory工厂类生成。

⑦ 信任管理器——TrustManager。此接口负责判断决定是否信任对方的安全证书,TrustManager对象由TrustManagerFactory工厂类生成。

1.查询JDK支持的TLS版本

    SSLContext context = SSLContext.getInstance("TLS");
    context.init(null, null, null);
    SSLSocketFactory factory = (SSLSocketFactory) context.getSocketFactory();
    SSLSocket socket = (SSLSocket) factory.createSocket();
    String[] protocols = socket.getSupportedProtocols();
    System.out.println("Supported Protocols: " + protocols.length);
    for
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,需要导入以下依赖: ```scala import java.io.InputStream import java.security.KeyStore import javax.net.ssl.{KeyManagerFactory, SSLContext, TrustManagerFactory} import org.apache.spark.rdd.RDD import org.apache.spark.sql.SparkSession ``` 接下来,定义一个SSL/TLS通信异常检测的Spark算子,该算子接收一个RDD作为输入,输出异常的IP和端口: ```scala def detectSSLTLSExceptions(rdd: RDD[String]): RDD[(String, Int)] = { // SSL/TLS协议类型 val protocol = "TLS" // 加载证书 val keystore = "path/to/keystore.jks" val password = "password" // 初始化SSLContext val keyStore: KeyStore = KeyStore.getInstance("JKS") val keyStoreStream: InputStream = getClass.getClassLoader.getResourceAsStream(keystore) keyStore.load(keyStoreStream, password.toCharArray) val kmf: KeyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm) kmf.init(keyStore, password.toCharArray) val tmf: TrustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm) tmf.init(keyStore) val sslContext: SSLContext = SSLContext.getInstance(protocol) sslContext.init(kmf.getKeyManagers, tmf.getTrustManagers, null) // 定义异常检测函数 def detectException(host: String, port: Int): Boolean = { try { val socket = sslContext.getSocketFactory.createSocket(host, port) socket.close() false } catch { case e: Exception => true } } // 对RDD的每个IP和端口进行异常检测 rdd.flatMap(line => { val parts = line.split(",") val host = parts(0) val port = parts(1).toInt if (detectException(host, port)) { Some((host, port)) } else { None } }) } ``` 在上述代码,我们首先加载证书并初始化SSLContext。然后定义了一个detectException函数,该函数尝试通过SSLContext创建一个socket连接,并在连接成功后立即关闭socket。如果连接失败,则表明存在异常行为。 最后,我们对RDD的每个IP和端口进行异常检测,并将异常的IP和端口作为输出。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值