Java SSL与TLS客户端证书配置方式

 更新时间:2024年01月23日 10:30:16   作者:茅坤宝骏氹  
这篇文章主要介绍了Java SSL与TLS客户端证书配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、TLS安全概念

(1)PKI

PKI是 Public Key Infrastructure的简称,意思是公钥基础设施。

公钥基础设施是提供公钥加密和数字签名服务的系统或平台,目的是为了管理密钥和证书。通过证书和秘钥来确认通讯双方是否可信任。

(2)CA

CA是Certificate Authority的简称,即证书的签发机构,它是PKI的核心。

正常情况来说,CA是具有权威性的机构,通过CA获取证书需要给钱。

但是有的时候可能不想用CA机构的证书,又想要使用https站点,那么可能就需要自己生成证书,但是这种证书浏览器是认为不安全的,本文档后边的具体步骤即针对这种场景。

(3)https

https是http+ssl,通俗点说,就是采用http通讯的安全传输协议,用来保证http传输过程中数据的机密性、完整性和可靠性,ssl需要证书。

(4)单向认证

网络通讯是双向的,但是安全认证不一定都是双向。大多数情况下可能都是单向的,只需要客户端确认服务端是可靠的,而服务端不管客户端是否可靠。

即客户端,比如浏览器会验证服务端证书,服务端不需要客户端证书。

(5)双向认证

双向认证相对于单向认证,即客户端需要确认服务端是否可信,服务端也需要确认客户端是否可信。

双方都要验证对方的证书

(6)SSL 

 Secure Sockets Layer,一种加密协议规范,如https就使用它进行加解密

(7)OpenSSL

一种ssl规范的实现,可以帮助我们生成解析各类证书

(8)X.509

证书标准,比如证书应该包含哪些信息

(9)PEM

Privacy Enhanced Mail,一种编码格式,常用于Apache和UNIX服务器,查看证书信息:openssl x509 -in certificate.pem -text -noout

(10)DER

Distinguished Encoding Rules,一种编码格式,常用于Java和Windows服务器,查看证书的信息:openssl x509 -in certificate.der -inform der -text -noout

(11)CRT

certificate,证书文件,常见于UNIX系统,大多应是PEM编码

(12)CER

certificate,证书文件,常见于Windows系统,大多应是DER编码.

(13)KEY

通常用来存放一个公钥或者私钥,查看不同编码格式文件内容

(14)CSR

Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,查看方法:openssl req -noout -text -in my.csr (DER格式同上后面加上-inform der)

(15)PFX/P12

predecessor of PKCS#12,对Unix服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中,因此这个文件包含了证书及私钥。

(16)JKS

Java Key Storage,跟OpenSSL关系不大,Java的keytool工具可以将PFX转为JKS,也能直接生成JKS

二、证书存储格式

1、pem格式:pem、crt、key后缀。编码方式base64,key使用pkcs1、pkcs8格式存储

2、p12(通用的证书存储格式)

3、jks(java的证书存储格式,依赖jdk版本,小版本差异会报错)

三、证书客户端设置

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

(1)单向认证

        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
        FileInputStream caInputStream = new FileInputStream(caPath);
        List<X509Certificate> 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());

(2)双向认证

   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;
    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 智能 AI 代码生成工具 Cursor 安装和使用超详细教程

    智能 AI 代码生成工具 Cursor 安装和使用超详细教程

    Cursor.so 是一个集成了 GPT-4 的国内直接可以访问的,优秀而强大的免费代码生成器,可以帮助你快速编写、编辑和讨论代码,这篇文章主要介绍了智能 AI 代码生成工具 Cursor 安装和使用介绍,需要的朋友可以参考下
    2023-05-05
  • java中join方法的理解与说明详解

    java中join方法的理解与说明详解

    这篇文章主要给大家介绍了关于java中join方法的理解与说明的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • Java趣味练习题之输出两个日期之间的相隔天数

    Java趣味练习题之输出两个日期之间的相隔天数

    本篇文章介绍了我看到的一个趣味小题目,怎么求得两个日期之间相隔的天数,以及解决该题目的过程及思路,通读本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2021-10-10
  • SpringBoot 进行限流的操作方法

    SpringBoot 进行限流的操作方法

    限流是对某一时间窗口内的请求数进行限制,保持系统的可用性和稳定性,防止因流量暴增而导致的系统运行缓慢或宕机。本文重点给大家介绍SpringBoot 进行限流的操作方法,感兴趣的朋友一起看看吧
    2021-10-10
  • MyBatis的动态SQL语句实现

    MyBatis的动态SQL语句实现

    这篇文章主要介绍了MyBatis的动态SQL语句实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • Java实现AES加密算法的简单示例分享

    Java实现AES加密算法的简单示例分享

    这篇文章主要介绍了Java实现AES加密算法的简单示例分享,AES算法是基于对密码值的置换和替代,需要的朋友可以参考下
    2016-04-04
  • Springboot jpa @Column命名大小写问题及解决

    Springboot jpa @Column命名大小写问题及解决

    这篇文章主要介绍了Springboot jpa @Column命名大小写问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java Volatile关键字你真的了解吗

    Java Volatile关键字你真的了解吗

    这篇文章主要为大家介绍了Java Volatile关键字,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • 简单了解java ibatis #及$的区别和用法

    简单了解java ibatis #及$的区别和用法

    这篇文章主要介绍了简单了解java ibatis #及$的区别和用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • struts1之ActionServlet详解_动力节点Java学院整理

    struts1之ActionServlet详解_动力节点Java学院整理

    这篇文章主要介绍了struts1之ActionServlet详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09

最新评论