我正在用 Java 设置一个许可 servlet 以及一个客户端应用程序,该应用程序将发布新许可请求并验证该服务器上的现有许可。servlet 在 Tomcat 中运行。我已经配置了 Tomcat,以便它只允许通过 https 连接到 servlet,这工作得很好。
我创建了一个自签名证书,使用'keytool -genkey -alias www.mysite.com -keyalg RSA -keystore license.store'
它创建一个文件license.store
并将 tomcat 指向这个 keystoreFile 及其密码asdf1234
。
当我尝试通过 Java 中的 https 从客户端连接到 servlet 时,我收到了熟悉PKIX path building failed
的信息,因为证书不在信任库中。我尝试使用此建议解决此问题,导致以下代码:
private SSLSocketFactory getSSLFactory() throws Exception {
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
InputStream is = this.getClass().getResourceAsStream("license.store");
if(is ==null) {
return null;
}
keyStore.load(is, "asdf1234".toCharArray());
is.close();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmf.init(keyStore);
SSLContext ctx = SSLContext.getInstance("TLS");
ctx.init(null, tmf.getTrustManagers(), null);
return ctx.getSocketFactory();
}
之后我打电话:
HttpsURLConnection con = (HttpsURLConnection)url.openConnection();
con.setSSLSocketFactory(getSSLFactory());
这导致成功的连接。
现在的问题是,只有当我将它复制license.store
到客户端并将其加载到KeyStore.load()
. 将服务器使用的私钥及其密码复制到客户端并不是很安全。有没有办法只从 license.store 中提取公钥并使用它?我已经在这个论坛和其他论坛上搜索了一天,但似乎无法得到它。