我正在建立与已启用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的滥用.