栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

文章目录
  • 前言
  • 一、通信加密这件事
  • 二、了解TLS
  • 三、JDK如何对TLS提供支持?
    • 1.查询JDK支持的TLS版本
    • 2.证书设置
    • 4.SSLSocket
    • 5.NIO/AIO SSL Socket
    • 6.Netty
  • 四、名词解释
  • 五、其他
  • 六、参考附录


前言

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 (int i = 0; i < protocols.length; i++) {
        System.out.println(protocols[i]);
    }
    protocols = socket.getEnabledProtocols();
    System.out.println("Enabled Protocols: " + protocols.length);
    for (int i = 0; i < protocols.length; i++) {
        System.out.println(protocols[i]);
    }
2.证书设置

KeyManager是提供客户端证书管理,TrustManager是信任服务端证书管理

        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        FileInputStream caInputStream = new FileInputStream(caPath);
        List caList =  certificateFactory.generateCertificates(caInputStream).stream().map(v->
                (X509Certificate)v).collect(Collectors.toList());
        KeyStore keystore = KeyStore.getInstance("JKS");
        keystore.load(null, null);
        for(X509Certificate ca: caList)
           keystore.setCertificateEntry(ca.getSubjectDN().getName(), ca);
        TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX");
        tmf.init(keystore);
 
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), new SecureRandom());
   private void sslContext() {
       // 初始化密钥库
        KeyManagerFactory keyManagerFactory = KeyManagerFactory
                .getInstance("SunX509");
        KeyStore keyStore = getKeyStore("client.jks", "123456", "PKCS12");
        keyManagerFactory.init(keyStore, "123456".toCharArray());
        // 初始化信任库
        TrustManagerFactory trustManagerFactory = TrustManagerFactory
                .getInstance("SunX509");
        KeyStore trustkeyStore = getKeyStore("server.jks", "123456", "JKS");
        trustManagerFactory.init(trustkeyStore);
        // 初始化SSL上下文
        SSLContext ctx = SSLContext.getInstance("SSL");
        ctx.init(keyManagerFactory.getKeyManagers(), trustManagerFactory
                .getTrustManagers(), null);
 
    }
 
    private  KeyStore getKeyStore(String keyStorePath, String password, String type)
            throws Exception {
 
        FileInputStream is = new FileInputStream(keyStorePath);
        KeyStore ks = KeyStore.getInstance(type);
        ks.load(is, password.toCharArray());
        is.close();
        return ks;
    }
4.SSLSocket

SSLServerSocket/SSLSocket

5.NIO/AIO SSL Socket

NIO SSL Socket Server
AIO原理类似,实现上可以参考smart-socket的SSLPlugin

6.Netty

Netty实现TLS/SSL双向加密认证

启动时通过-Djavax.net.debug=ssl,handshake开启debug


四、名词解释
  1. PKI:PKI是 Public Key Infrastructure的简称,意思是公钥基础设施。公钥基础设施是提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书。通过证书和秘钥来确认通讯双方是否可信任。
  2. CA:CA是Certificate Authority的简称,即证书的签发机构,它是PKI的核心。正常情况来说,CA是具有权威性的机构,通过CA获取证书需要给钱。但是有的时候可能不想用CA机构的证书,又想要使用https站点,那么可能就需要自己生成证书,但是这种证书浏览器是认为不安全的。
  3. OpenSSL:一种ssl规范的实现,可以帮助我们生成解析各类证书
  4. X.509:证书标准,比如证书应该包含哪些信息
  5. PEM:Privacy Enhanced Mail,一种编码格式,常用于Apache和UNIX服务器,查看证书信息:openssl x509 -in certificate.pem -text -noout
  6. DER:Distinguished Encoding Rules,一种编码格式,常用于Java和Windows服务器,查看证书的信息:openssl x509 -in certificate.der -inform der -text -noout
  7. CRT:certificate,证书文件,常见于UNIX系统,大多应是PEM编码
  8. CER:certificate,证书文件,常见于Windows系统,大多应是DER编码.
  9. KEY:通常用来存放一个公钥或者私钥,查看不同编码格式文件内容
  10. CSR:Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,查看方法:openssl req -noout -text -in my.csr (DER格式同上后面加上-inform der)
  11. PFX/P12:predecessor of PKCS#12,对Unix服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中,因此这个文件包含了证书及私钥。
  12. JKS:Java Key Storage,跟OpenSSL关系不大,Java的keytool工具可以将PFX转为JKS,也能直接生成JKS
五、其他
  1. C/S架构长连接使用双向认证+二次加密安全性更高,成本也一样高,实践下,可考虑使用单向认证,自签证书可在在客户端修改校验逻辑,以达到去掉校验只使用加密能力的目的,CA整数定期维护也可。
 trustManagers = new TrustManager[]{new X509TrustManager() {
     @Override
     public void checkClientTrusted(X509Certificate[] x509Certificates, String s) {
     }

     @Override
     public void checkServerTrusted(X509Certificate[] x509Certificates, String s) {
     }

     @Override
     public X509Certificate[] getAcceptedIssuers() {
         return new X509Certificate[0];
     }
 }};
  1. 在对性能敏感的场景慎重验证SSL对应用性能影响,通信是双方的事,而性能主要取决于双方协商出来的算法套件,对性能关注的话需要关注这个过程,防止客户端服务端协商出来的算法是不合适的,如果出现这种情况可升级版本或手动控制来解决。找到的一篇关于SSL性能调优文章
六、参考附录

SSL/TLS的Java实现

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1013255.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号