具有自签名证书的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
选项。 这是一个例子 。
- wit.ai – 如何用Java发送请求?
- 如何从Tomcat Java应用程序捕获SOAP消息到外部服务器?
- HTTPSURLconnection和Apache(系统)DefaultHttpClient之间的证书链不同
- SSL证书validation:javax.net.ssl.SSLHandshakeException
- HttpsURLConnection:连接超时错误
- javax.net.ssl.SSLException:无法识别的SSL消息,明文连接?
- Spring Library中的REST(RestTemplate)是否支持HTTPS协议?
- Tomcat HTTPS密钥库证书
- 在反向代理后面需要使用Spring Security的https