以编程方式访问Java密钥库以创建SSLSocketFactory

我正在建立与已启用ssl的服务器的SSL连接.我的硬件的文件系统java密钥库中有一个cacerts文件,并使用keytool&从其中提取了证书.我正在提供此证书文件以创建SSLSocketfactory来建立ssl连接,该连接可与下面的代码段配合使用.

我想知道如何直接访问cacerts(java keystore)文件,并选择证书并建立ssl连接.现在,我将提取的证书与jar文件打包在类路径中,这不是一个好习惯,因为我希望从密钥库中加载它.

以下是我当前如何创建SSLSocketFactory的工作代码段.

private SSLSocketFactory createSSLFactory() {
  KeyStore keyStore = null;
  TrustManagerFactory tmf = null;
  SSLContext ctx = null;

  try {
    keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
    InputStream is = null;
    is = SSLConnection.class.getResourceAsStream("/" + "my-keystore");
    keyStore.load(is, "changeit".toCharArray());
    tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(keyStore);
    ctx = SSLContext.getInstance("TLSv1");
    ctx.init(null, tmf.getTrustManagers(), null);
    SSLSocketFactory factory = ctx.getSocketFactory();
    return factory;
  } catch (Exception e) {
    // exception handling
  }
  return null;
}

解决方法:

对于私钥和认证证书,将KeyStore嵌入到JAR文件中没有任何意义.客户证书应该可以唯一地标识客户.它是主机的属性,而不是JAR文件,可以无限地复制它.允许多个客户端使用相同的客户端证书是没有意义的.这是对PKI的滥用.

上一篇:Android证书已过期


下一篇:这里是否使用了Android Keystore中提供的信息?在我们签署应用程序后,它甚至可读吗?