具有自签名证书的Java SSL连接,无需将完整密钥库复制到客户端

我正在设置一个Java许可servlet以及一个客户端应用程序,该应用程序将发布新许可证请求并validation该服务器上的现有许可证。 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中提取公钥并使用它? 我一直在寻找这个论坛和其他人一天,似乎无法得到它。

您不应该生成公钥 – 私钥对,而是将服务器的证书导入您的(客户端)Java信任库。 证书不是秘密,因此不会在客户端提供安全风险。 请参阅keytool的-import选项。 这是一个例子 。