繁体   English   中英

使用Java客户端点击Tomcat HTTPS URL

[英]Hitting Tomcat HTTPS URL with a Java Client

我已将Tomcat实例配置为在端口8443上使用SSL。我已经通过浏览器上的https:8443命中了主要的tomcat页面,从而验证了它的工作能力。

现在,我试图了解如何使Java程序从该tomcat服务器上的HTTPS URL读取。 我按照这里的说明进行操作:

Java SSL教程

我只是将.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客户端从Web服务器读取数据,我需要做些什么?

-------编辑

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

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

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

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

终于成功了。 一路上遇到了一些障碍:

由于某种原因,我不得不在Eclipse中设置如下网址:

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>

我仍然想更好地了解客户端(而不是整个密钥库)上的需求,但是至少我现在可以尝试一下。

Java“密钥库”文件用于实现两个概念上不同的目的。 一个目的是用作密钥存储,其中一个用于存储用来证明机器自身身份的密钥对。 另一个目的是充当信任库,该信任库用于存储用于标识一个人信任的其他计算机的信息。

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

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

Java中的密钥SSL套接字连接

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM