gpt4 book ai didi

java - 使用 Java 客户端访问 Tomcat HTTPS URL

转载 作者:行者123 更新时间:2023-11-28 22:56:47 24 4
gpt4 key购买 nike

我已将我的 Tomcat 实例配置为在端口 8443 上使用 SSL。我已通过浏览器上的 https:8443 访问主 tomcat 页面来验证它是否正常工作。

现在我试图了解我需要做什么才能让 Java 程序读取该 tomcat 服务器上的 HTTPS URL。我按照此处的说明操作:

Java SSL Tutorial

我刚刚将 .keystore 文件复制到我的客户端,该文件是我在我的 Web 服务器上使用 Java 的 keytool 生成的。它是自签名的,仅用于开发工作。这对我来说似乎有点奇怪,因为它也有私钥,对吧?我想我会做一些事情来导出公钥并将其放在我的客户端上,但我找不到关于我需要执行哪些步骤的好的指南。

无论如何,当我尝试在我的客户端中使用在我的服务器上生成的 .keystore 时,我得到了这个错误:

***
%% Invalidated: [Session-1, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA]
main, SEND TLSv1 ALERT: fatal, description = certificate_unknown
main, WRITE: TLSv1 Alert, length = 2
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Unknown Source)

我已将我的客户端设置为使用这些 JVM args 运行:

-Djavax.net.ssl.keyStore=.keystore  -Djavax.net.ssl.keyStorePassword=changeit -Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol -Djavax.net.debug=ssl

它确实在那个 .keystore 中打印了一堆东西,所以我确定它正在读取它。但是服务器在尝试握手时似乎并不喜欢它。

我需要做什么才能让 SSL Java 客户端从我的网络服务器读取数据?

--------编辑

糟糕,我刚刚注意到我为客户端使用了错误的 JVM args。我改成了这个,现在似乎更进一步了。

-Djavax.net.ssl.trustStore=.keystore -Djavax.net.ssl.trustStorePassword=changeit

我还没有得到它来读取 URL 数据。而且我仍然想知道如何只向客户端提供公钥,以便它可以进行解密而不是整个服务器 keystore 。

------------ 编辑#2

终于成功了。一路上有几个障碍:

出于某种原因,我不得不在 Eclipse 中制作这样的 URL:

URL myurl = new URL("https", host, port, "/docs/setup.html", new sun.net.www.protocol.https.Handler());
HttpsURLConnection con = (HttpsURLConnection)myurl.openConnection();

否则我会在第二行得到一个类转换异常。

而且,我必须重新生成我的服务器 .keystore 文件并使用如下替代名称复制到我的客户端:

keytool -genkey -alias tomcat -keyalg RSA -ext san=ip:<my server ip>

我仍然希望更好地了解客户端需要什么,而不是整个 keystore ,但至少我现在可以使用它了。

最佳答案

Java“ keystore ”文件用于服务于两个概念上不同的目的。一个目的是用作 keystore ,这是一个存储用于证明机器自身身份的 key 对的地方。另一个目的是作为信任库,用于存储用于识别其他信任机器的信息。

您不应该将服务器的 keystore 文件复制到客户端,因为正如您所说,它包含服务器的私钥,它包含该文件是因为该文件是服务器的 keystore 。相反,您希望创建自己的 keystore 文件作为客户端的信任库,您希望在其中导入服务器的证书,以便您的客户端知道信任服务器。为此,您从服务器的 keystore 中导出一个证书,然后将该证书导入到客户端的 keystore 文件中。

一些更详细的信息出现在我对这个问题的相关回答中:

Secret Key SSL Socket connections in Java

关于java - 使用 Java 客户端访问 Tomcat HTTPS URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25208494/

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