簡體   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