上周五遇到一個問題,工程本地編譯運行正常,打包本地tomcat運行也正常。部署到測試環境報錯:
2017-05-05 09:38:11.645 ERROR [HttpPoolClientsUtil.java:332] http請求異常
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(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1937)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:302)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1478)
at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:212)
at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1050)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1375)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.createLayeredSocket(SSLConnectionSocketFactory.java:394)
at org.apache.http.conn.ssl.SSLConnectionSocketFactory.connectSocket(SSLConnectionSocketFactory.java:353)
....
異常信息很明顯:沒有可用證書。
百度找到解決方案:
可通過客戶端信任所有證書或是服務器端添加證書兩種方式解決,具體原因分析及解決方式見:http://www.trinea.cn/android/android-java-https-ssl-exception-2/
找答案過程中還發現一個問題,也可能導致訪問https鏈接出異常,順便記錄。
Java 密碼擴展無限制權限策略文件
因為某些國家的進口管制限制,Java發布的運行環境包中的加解密有一定的限制。比如默認不允許256位密鑰的AES加解密,解決方法就是修改策略文件。
官方網站提供了JCE無限制權限策略文件的下載:
JDK6的下載地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
JDK7的下載地址:
http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
下載后解壓,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。
如果安裝了JRE,將兩個jar文件放到%JRE_HOME%\lib\security下覆蓋原來文件,記得先備份。
如果安裝了JDK,將兩個jar文件也放到%JDK_HOME%\jre\lib\security下。
由於信息安全在軍事等方面極其重要,如在第二次世界大戰期間,使用了無線電,若是能夠成功解密敵方的機密情報,往往預示着戰爭的勝利,
因此美國對加密解密等軟件進行了出口限制,JDK中默認加密的密鑰長度較短,加密強度較低,而UnlimitedJCEPolicyJDK7中的文件則沒有這樣的限制,因此為了獲得更好的加密強度,需要替換掉那兩個文件。