IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> java创建带本地证书的KeyStore类 -> 正文阅读

[网络协议]java创建带本地证书的KeyStore类

快速方法:

// 带有jdk默认证书库的KeyStore对象
KeyStore cacertsKeyStore = KeyStoreUtil.getCacertsKeyStore();

一、需求背景

??????在使用HttpClient来设置server端提供的第三方证书的时候, 自己创建了一个空的KeyStore对象,然后再往空的KeyStore对象中放入第三方证书。但是这样会导致一个结果就是不能使用jdk提供的大证书,也就不能访问像百度这样的官方网站的https服务。

二、经历过程

1、使用HttpClient 4.5默认的创建连接池的方法为:

PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager(socketFactoryRegistry);

2、如果使用这个对象来创建连接池则你能正常的访问像百度这样的官方https服务,证明这个构造方法里面肯定加载了相关的证书,所以继续进入到方法里面去,发现https其实是加载了一个SSLConnectionSocketFactory对象:

private static Registry<ConnectionSocketFactory> getDefaultRegistry() {
    return RegistryBuilder.<ConnectionSocketFactory>create()
            .register("http", PlainConnectionSocketFactory.getSocketFactory())
            .register("https", SSLConnectionSocketFactory.getSocketFactory())
            .build();
}

3、再往源码走几步进入到获取KeyStore对象的代码中去,这里创建出来的对象就是一个存放了jdk证书的KeyStore对象:
在这里插入图片描述
4、查看这个getCacacertsKeyStore(“trustmanager”)方法,发现这个方法其实就是去加载了jre里面的一个cacerts文件:
在这里插入图片描述
对应的证书文件如下:
在这里插入图片描述

5、到这里问题就已经解决了,可以看到HttpClient就是加载了JDK中的cacerts证书文件,这个证书文件中大概有100多个证书。
6、如果想自己想要添加一个第三方证书又想能访问这些jdk已经带的证书,则可以通过如下代码来定义自己的keyStore:

   /**
   *
   * @param certificatePathList 所有证书的inputStream集合
   * @return
   * @throws CertificateException
   */
  public static KeyStore createKeyStore(ArrayList<InputStream> certificatePathList) throws CertificateException {
    //创建证书工厂
    CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");

    KeyStore keyStore = null;
    try {
      keyStore = KeyStoreUtil.getCacertsKeyStore();
      int index = 0;
      //将所有证书放入证书放入keystore中
      for (InputStream inputStream : certificatePathList) {
        Certificate certificate = certificateFactory.generateCertificate(inputStream);
        String certificateAlias = Integer.toString(index++);
        keyStore.setCertificateEntry(certificateAlias, certificate);
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
    return keyStore;
  }
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-19 08:19:50  更:2021-09-19 08:20:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/11 2:11:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码