gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:25 28 4
gpt4 key购买 nike

我正在用 Java 设置一个许可 servlet 以及一个客户端应用程序,该应用程序将发布新许可证请求并在该服务器上验证现有许可证。 servlet 在 Tomcat 中运行。我已经配置了 Tomcat,以便它只允许通过 https 连接到 servlet,这工作得很好。

我使用 'keytool -genkey -alias www.mysite.com -keyalg RSA -keystore license.store' 创建了一个自签名证书,它创建了一个文件 license.store 并使用密码 asdf1234 将 tomcat 指向此 keystoreFile。

当我尝试在 Java 中通过 https 从客户端连接到 servlet 时,我收到熟悉的 PKIX path building failed 因为证书不在信任库中。我尝试使用 this 修复此问题建议产生以下代码:

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 中提取公钥并使用它吗?我已经在这个论坛和其他论坛上搜索了一天,但似乎无法找到它。

最佳答案

您不应生成公私 key 对,而应将服务器证书导入您(客户端)的 Java 信任库。证书不是 secret ,因此不会在客户端带来安全风险。请参阅 keytool 的 -import 选项。这是一个 example .

关于具有自签名证书的 Java SSL 连接,无需将完整的 keystore 复制到客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14389537/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com