簡體   English   中英

致命錯誤sun.security.validator PKIX路徑構建失敗

[英]Fatal Error sun.security.validator PKIX path building failed

我之前已經遇到了這個問題,並通過更新JDK解決了問題。 早些時候,當我遇到此問題時,我使用的是Yum的默認安裝,后來我從oracle下載了JDK並進行了安裝,並按照新的安裝目錄更改了默認的$ JAVA_HOME路徑。 現在再次出現相同的問題,我已經在網上檢查了相關的帖子 ,找不到任何修復程序。

我們使用的示例代碼只是通過http或https進行的簡單身份驗證。

//Http client object
HttpClient client = new HttpClient();
HostConfiguration config = client.getHostConfiguration();
client.getParams().setParameter("http.socket.timeout", new Integer(100000));


String Url = 'https://example.com/';
PostMethod method = new PostMethod(Url);

//Handler to try for 3 attempt in case of network failure
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
                                                                new DefaultHttpMethodRetryHandler(3, false));

//Here we are trying to connect through Httpclient method
int statusCode = client.executeMethod(method);

不知道是什么原因引起的。

    keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts
    Enter keystore password:

    Keystore type: JKS
    Keystore provider: SUN

Your keystore contains 76 entries

於2013年2月11日編輯

我進行了更多測試,並重新安裝了jdk和tomcat,但仍然收到相同的錯誤。

Failure-Fatal transport error:
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

我按照URL上給出的說明進行操作:

java InstallCert services.example.com
Loading KeyStore jssecacerts...
Opening connection to services.example.com:443...
Starting SSL handshake...

No errors, certificate is already trusted

Server sent 1 certificate(s):

 1 Subject CN=*.example.com, OU=Domain Control Validated, O=*.example.com
   Issuer  SERIALNUMBER=04343339, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US

這表明證書已經添加到cacerts中。 現在,這變得越來越有趣。

后終於從成員所有的麻煩和幫助下,我得到了這個問題的修復程序。 如果將來有人遇到相同的問題,我將提供答案。

Server services.example.com使用的是通配符證書(在我的情況下),並且在SSL握手過程中未發送完整的證書(據我所知),這導致了此問題。

為了解決這種問題,我們需要將證書添加到java truststore“ cacerts”。

1:我從URL http://nodsw.com/blog/leeland/2006/12/06-no-more-unable-find-valid-certification-path-requested-target下載了Java代碼,並將此文件放在服務器在“ $ JAVA_HOME / jre / lib / security / cacerts”位置

2:我使用創建一個類文件的“ javac InstallCerts.java”編譯了代碼。

3:然后執行以下命令以添加服務器“ services.example.com”的證書

java InstallCert services.example.com

Enter certificate to add to trusted keystore or 'q' to quit: [1]
1

我輸入“ 1”將證書添加到信任文件“ jssecacerts”。

4:最后,我將文件“ cacerts”替換為文件“ jssecacerts”。 (注意:在替換之前先備份兩個文件)

mv cacerts cacerts-bkp-12-Feb-2013
cp –p  jssecacerts cacerts

5:確認證書已添加到cacerts文件中。 要確認它,請執行以下命令:

keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts | grep example
Enter keystore password:

services.example.com-1, Feb 12, 2013, trustedCertEntry,

6:重新啟動相關服務並測試了該問題,此問題已得到解決。

您的信任庫不信任服務器證書。 它是自簽名的嗎? 您可能需要將其從服務器導出到信任庫中。

因此,也許有人會遇到這個問題,這是一個令人沮喪的問題,我花了兩天時間才能找到並解決。 問題在於,JVM不信任服務器的證書,因此,解決方案是將我們的Tomcat服務器和JVM配置為信任此站點。 因此,我將提及解決問題的所有步驟:

  1. 通過打開與firefox的鏈接來下載站點的證書,然后單擊綠色鎖,然后單擊更多信息,然后單擊安全性選項卡,查看證書按鈕,詳細信息選項卡,最后是導出按鈕。 讓我們假設它名為server_cert.crt
  2. 將證書添加到要信任的JVM證書列表中:您應該可以通過導航到C:\\ Program Files \\ Java \\ jre1.8.0_151 \\ lib \\ security來做到這一點。 要更新的文件名為cacerts,因此將下載的證書server_cert.crt復制到該文件夾​​,然后在相同位置打開命令行,然后執行以下命令:

keytool -J-Duser.language = zh-CN -import -trustcacerts -alias somealiasexp -keystore cacerts-文件server_cert.crt

密碼是changeit,您應該在命令行中進行肯定確認。 要檢查是否已添加證書,請執行以下命令:

keytool-列表-keystore cacerts -alias somealiasexp

並且應該顯示證書。

  1. 現在,讓我們配置tomcat服務器以使用cacerts密鑰庫,轉到文件夾“ C:\\ Program Files \\ Java \\ apache-tomcat-7.0.88 \\ bin”並創建文件“ setenv.bat”,然后在其中復制此代碼:

設置JAVA_OPTS =“-Djavax.net.ssl.trustStore = C:/ Program Files / Java / jre1.8.0_151 / lib / security / cacerts”“ -Djavax.net.ssl.trustStorePassword = changeit”

  1. 另一方面,我們必須為ssl配置一個新的端口或連接器,例如,其中包含密鑰庫和證書,因此:
  2. 創建一個新文件夾,例如“ C:/ tomcatkeystore”
  3. 輸入文件夾並通過在CMD上執行命令來創建新的密鑰庫:

keytool -genkey -alias tomcat -keyalg RSA -keystore tomcatkeystore.jks當執行此命令時,您將不得不設置密碼,假設它是“ some_password”。

  1. 如果要購買受信任的證書,則必須通過執行以下命令來生成證書請求:

keytool -certreq -keyalg RSA -alias tomcat-文件certtomcat.csr -keystore tomcatkeystore.jks

  1. 將下載的證書server_cert.crt復制到該文件夾​​中,然后通過執行以下命令將其添加到生成的密鑰庫中:

keytool -J-Duser.language = zh-CN -import -trustcacerts -alias somealias -keystore tomcatkeystore.jks-文件server_cert.crt

  1. 現在,通過復制以下標記,可以更新位於“ C:\\ Program Files \\ Java \\ apache-tomcat-7.0.88 \\ conf”文件夾中的文件server.xml:

 <Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol" maxThreads="150" SSLEnabled="true" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="file:///C:/tomcatkeystore/tomcatkeystore.jks" keystorePass="some_password" /> 

  1. 現在最后一步是重新啟動服務器。

要測試ssl端口是否配置正確,您應該能夠在鏈接“ https:// localhost ”中訪問tomcat接口,並為其添加一個例外。 就是這樣,我希望這對您有所幫助。

暫無
暫無

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

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