java创建带本地证书的KeyStore类

本文介绍如何在使用HttpClient时处理第三方证书,并确保同时可以利用JDK自带的信任证书进行HTTPS请求。通过自定义KeyStore的方式,既能够加入外部证书,又能保持对预装证书的支持。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

快速方法:

// 带有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;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值