具有自签名证书的Java SSL连接,无需将完整密钥库复制到客户端
我正在用Java和一个客户端应用程序设置一个许可servlet,该客户端应用程序将发布新许可证的请求,并在该服务器上验证现有许可证。servlet在Tomcat中运行。我已经配置了Tomcat,因此它只允许通过https连接到servlet,这很好 我已经使用具有自签名证书的Java SSL连接,无需将完整密钥库复制到客户端,java,servlets,ssl,https,keytool,Java,Servlets,Ssl,Https,Keytool,我正在用Java和一个客户端应用程序设置一个许可servlet,该客户端应用程序将发布新许可证的请求,并在该服务器上验证现有许可证。servlet在Tomcat中运行。我已经配置了Tomcat,因此它只允许通过https连接到servlet,这很好 我已经使用'keytool-genkey-alias www.mysite.com-keyalg RSA-keystore license.store'创建了一个自签名证书,它创建了一个文件license.store,并用密码asdf1234将tom
'keytool-genkey-alias www.mysite.com-keyalg RSA-keystore license.store'
创建了一个自签名证书,它创建了一个文件license.store
,并用密码asdf1234
将tomcat指向这个keystrefile
当我尝试在Java中通过https从客户端连接到servlet时,我收到了熟悉的PKIX路径构建失败
,因为证书不在信任库中。我尝试使用建议修复此问题,结果出现以下代码:
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());
这将导致成功连接
现在的问题是,我只有在将
许可证.store
复制到客户端并将其加载到KeyStore.load()
中时,才能实现这一点。我觉得将服务器使用的私钥及其密码复制到客户端并不安全。有没有办法只从license.store提取公钥并使用它?我已经搜索了这个论坛和其他论坛一天了,但似乎没有找到它。您不应该生成一个公私密钥对,而是应该将服务器的证书导入您(客户端)的Java信任库。证书不是秘密,因此不会在客户端带来安全风险。请参阅keytool的-import
选项。这里是一个.示例,您不应该生成一个公私密钥对,而是应该将服务器的证书导入到您(客户机)的Java信任库中。证书不是秘密,因此不会在客户端带来安全风险。请参阅keytool的-import
选项。这是一张单张。我终于拿到了!问题是,我首先必须从keystore导出证书:keystore-export-alias www.mysite.com-file license.cer-keystore license.store,然后使用keystore-import-alias where-file license.cer-keystore client.store将导出的证书导入新的keystore。然后将client.store复制到客户端,该客户端在密钥库中读取,如上面的示例所示。我终于得到了它!问题是,我首先必须从keystore导出证书:keystore-export-alias www.mysite.com-file license.cer-keystore license.store,然后使用keystore-import-alias where-file license.cer-keystore client.store将导出的证书导入新的keystore。然后将client.store复制到客户机,并在密钥库中读取,如上面的示例所示。