【发布时间】:2014-01-27 04:09:58
【问题描述】:
我正在与启用 ssl 的服务器建立 SSL 连接。我的硬件文件系统 java 密钥库中有一个 cacerts 文件,我使用 keytool 从中提取了证书,并且我正在提供此证书文件以创建 SSLSocketfactory 以建立ssl 连接,与下面的代码 sn-p 配合得很好。
我想知道如何直接访问 cacerts (java keystore) 文件,然后选择证书并建立 ssl 连接。现在,我正在使用我的 jar 文件将提取的证书打包到类路径中,这不是一个好习惯,因为我希望从密钥库中加载它。
下面是我目前如何创建 SSLSocketFactory 的工作代码 sn-p。
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;
}
【问题讨论】:
-
为什么?您甚至不需要此代码,更不用说更多代码了。只需设置系统属性即可。
-
会尝试回发,只是好奇。如果通过系统属性设置密钥库路径,它会像那样遍历密钥库并为服务器选择正确的证书吗?
-
你有它回到前面。它遍历信任库以查找 trusted 证书;在 SSL 握手的第一条消息中将这些
subjectDNs作为受信任的 CA 发送到服务器;服务器发回应该由这些 CA 之一签名的证书;然后客户端在密钥库中检查。没有“为服务器选择正确的证书”的问题,除非您仍在谈论客户端身份验证。