[英]Hitting Tomcat HTTPS URL with a Java Client
我已將Tomcat實例配置為在端口8443上使用SSL。我已經通過瀏覽器上的https:8443命中了主要的tomcat頁面,從而驗證了它的工作能力。
現在,我試圖了解如何使Java程序從該tomcat服務器上的HTTPS URL讀取。 我按照這里的說明進行操作:
我只是將.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“密鑰庫”文件用於實現兩個概念上不同的目的。 一個目的是用作密鑰存儲,其中一個用於存儲用來證明機器自身身份的密鑰對。 另一個目的是充當信任庫,該信任庫用於存儲用於標識一個人信任的其他計算機的信息。
您不應該將服務器的密鑰庫文件復制到客戶端上,因為正如您所說的,它包含服務器的私鑰,因為文件是服務器的密鑰庫,所以它包含了該私鑰。 而是,您想創建自己的密鑰庫文件作為客戶端的信任庫,並在其中導入服務器的證書,以便您的客戶端知道信任服務器。 為此,您需要從服務器的密鑰庫中導出證書,然后將該證書導入客戶端的密鑰庫文件中。
一些更詳細的信息出現在我對此問題的相關答案中:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.