簡體   English   中英

Java SSL 握手錯誤 - Tomcat 密鑰庫

[英]Java SSL handshake error - Tomcat keystore

我試圖通過 SSL 連接(在之間發送一些數據)我的獨立應用程序和由 Tomcat 提供的其他應用程序:

https://tomcat_server:8843/app

不幸的是,我的獨立應用程序中出現錯誤:

引起:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX 路徑構建失敗:sun.security.provider.certpath.SunCertPathBuilderException:無法在 com.sun.net 上找到請求目標的有效認證路徑。 ssl.internal.ssl.Alerts.getSSLException(Unknown Source) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(未知來源)位於 com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(未知來源),位於 com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(未知來源),位於 com.sun.net。 ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source) at com.sun.net.ssl.internal.ssl.Handshaker.process_record(未知來源),位於 com.sun.net.ssl.SSLSocketImpl.readRecord(未知來源),位於 com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(未知來源),位於 com.sun.net。 ssl.int ernal.ssl.SSLSocketImpl.writeRecord(Unknown Source) at com.sun.net.ssl.internal.ssl.AppOutputStream.write(Unknown Source) at java.io.BufferedOutputStream.flushBuffer(Unknown Source) at java.io.BufferedOutputStream。 org.apache.commons.httpclient.HttpConnection.flushRequestOutputStream(HttpConnection.java:827) 處的flush(Unknown Source) org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.flushRequestOutputStream(MultiThreadedHttpConnectionManager.java:1525) 處的org.apache。 commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:1975) at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:993) at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java: 397) 在 org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:170) 在 org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:396) 在 org.apache.commons.httpclient.HttpClient .executeMethod(HttpCli) ent.java:324) 在 org.apache.commons.vfs.provider.http.HttpClientFactory.createConnection(HttpClientFactory.java:101) ... 9 更多

如果我將 url 定義為 http 它工作正常:

http://tomcat_server:8080/app

我認為這也不是應用程序的問題。 我已經在另一個 Tomcat 服務器上使用相同的應用程序嘗試了同樣的事情,它通過 https 工作。 這些服務器之間的唯一區別是我沒有在該服務器上創建密鑰庫文件 (pfx)。 我當然不能使用相同的密鑰庫,因為它的域不同(我也通過瀏覽器訪問這個應用程序)。 服務器上的 Tomcat 日志中沒有任何內容。 也許我在創建密鑰庫時做錯了什么。

以下是我使用 openssl 工具和我的密鑰、證書和中間證書生成密鑰庫文件的方法:

openssl pkcs12 -export -out certificate.pfx -inkey server.key -in server.crt -certfile intermediate.crt

這是我的連接器配置:

protocol="org.apache.coyote.http11.Http11Protocol"
       port="8443" maxThreads="200"
       scheme="https" secure="true" SSLEnabled="true"
       keystoreFile="/path/to/keystore/certificate.pfx" keystorePass="changeit"  ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA"
       keystoreType="PKCS12" clientAuth="false" sslProtocol="TLS"/>

兩台服務器具有相同的配置,所以我認為它必須是證書。 有誰知道如何解決它?

需要在JDK security中導入證書。 按照以下 2 步操作即可完成。

  • Step-1 轉到java安全目錄下面

/path/to/java/jdk/jre/lib/security

  • 步驟 2 運行以下命令

keytool -import -keystore cacerts -file /path/to/your/cert.cer

您的應用程序必須使用信任庫以及您添加到為 8443 指定的密鑰庫的證書的公共部分。這可以通過使用系統屬性來完成:

-Djavax.net.ssl.trustStore=/path/to/truststore/truststore.jks
-Djavax.net.ssl.trustStorePassword=truststorepassword

運行: openssl s_client -connect [working_server]:[working_port]然后對不工作的服務器執行同樣的操作。 比較結果; 根據您的描述,它們之間很可能沒有通用證書。 “損壞的”服務器證書鏈中的證書之一必須在您的應用程序的信任庫中才能工作(日志表明它們不是); 最好使用根證書,但在某些業務案例中,您可能更喜歡中間證書或葉證書本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM