当前位置: 首页 > 知识库问答 >
问题:

用Java客户endpoint击Tomcat HTTPS URL

东明德
2023-03-14

我已将Tomcat实例配置为在端口8443上使用SSL。我通过浏览器上的https:8443点击tomcat主页面,验证了它的有效性。

现在,我正试图理解我需要做什么才能让Java程序从tomcat服务器上的HTTPS URL读取。我按照这里的指示:

Java SSL教程

我只是抄了这本书。密钥库文件一直保存到我的客户机上,这是我在web服务器上用Java的keytool生成的。它是自签名的,只是为了开发工作。这对我来说有点奇怪,因为它也有私钥,对吧?我想我会做一些事情来导出公钥并将其放在我的客户机上,但我找不到一个很好的指南来说明我需要采取哪些步骤来实现这一点。

不管怎样,当我试着使用。在客户端的服务器上生成密钥库时,出现以下错误:

***
%% 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参数运行:

-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

它确实打印出了一堆这样的东西。密钥库,所以我相信它正在阅读。但服务器似乎不喜欢它尝试握手。

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

-------编辑

哎呀,我刚刚注意到我对客户端使用了错误的JVM参数。我改成了这个,现在它似乎更进一步了。

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

我还没有让它读取URL数据。我仍然想知道如何给客户端公钥,以便它可以进行解密,而不是整个服务器密钥库。

----------编辑#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();

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

而且,我必须重新生成我的服务器。密钥库文件,并使用以下替代名称复制到我的客户机:

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

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

共有1个答案

邹祺
2023-03-14

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

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

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

Java中的密钥SSL Socket连接

 类似资料:
  • 我正在编写一个进程,它必须连接(并保持活动)到几个(数百个)远程对等点,并管理对它们的消息传递/控制。 我制作了这个软件的两个版本:第一个版本使用经典的“每个连接线程”模型,第二个版本使用标准的javaNIO和选择器(以减少线程分配,但存在问题)。然后,环顾四周,我发现Netty在大多数情况下都能提高很多,于是我开始第三次使用它。我的目标是保持资源使用率非常低,保持快速。 一旦编写了具有自定义事件

  • 在本节中,我们将了解客户端攻击。最好使用服务器端攻击来访问目标计算机,例如尝试在已安装的应用程序或操作系统中查找漏洞。如果我们无法找到漏洞,或者目标隐藏在IP后面或使用隐藏网络,在这种情况下,我们将使用客户端攻击。客户端攻击要求用户执行某些操作,例如下载映像,打开链接,安装更新,然后在其计算机中运行代码。客户端攻击需要用户交互,这就是信息收集非常重要的原因。它收集有关个人申请的信息以及他们作为一个

  • 我想在一些计算机之间建立点对点连接,这样用户就可以在没有外部服务器的情况下聊天和交换文件。我最初的想法如下: 我在服务器上制作了一个中央服务器插座,所有应用程序都可以连接到该插座。此ServerSocket跟踪已连接的套接字(客户端),并将新连接的客户端的IP和端口提供给所有其他客户端。每个客户端都会创建一个新的ServerSocket,所有客户端都可以连接到它。 换句话说:每个客户端都有一个Se

  • 我对RxJava非常陌生,我仍在尝试理解数据流,但我想知道这是否可能,然后再深入兔子洞。 目标:解耦API资源并允许其分布,同时为客户端(web/移动)提供灵活性,以便根据仅提供给少数“已知”APIendpoint的href链接获取数据。 我从一个API中收集了JSON对象,其中每个json都有一个“href”字段,该字段提供指向API资源的链接,可以在其中检索数据的全部详细信息。例如: 检索此集

  • 简介 Java应用可以直接访问TensorFlow serving加载模型提供的服务,我们需要编写Java的gRPC客户端代码。 完整例子 这里有一个导出模型使用Java来访问模型的例子 https://github.com/tobegit3hub/deep_recommend_system/tree/master/java_predict_client 。 使用时通过Maven编译即可,不同模型

  • 我已经在AWS控制台中学习了IoT教程,用于设置Linux/Java设备,它下载了一个zip文件,并最终使用了这里的代码:https://github.com/AWS/aws-iot-device-sdk-java。当我从zip运行start.sh脚本时,我看到一个UnknownHostException,脚本失败。 按照正式文件的建议,诊断连通性没有问题;它连接得很好: 同样奇怪的是ping客户