java.net.SocketException: java.security.NoSuchAlgorithmException


java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.SSLContextImpl$DefaultSSLContext)
    at javax.net.ssl.DefaultSSLSocketFactory.throwException(SSLSocketFactory.java:198)
    at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:205)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

服務器從windows移植至linux上突然一些業務不能執行,追蹤至拋出來的異常如上。

解決開始:

定位:

問題確實是如上的異常,本地一切正常訪問,windows一切正常訪問

檢測是否為代碼問題,是否有平台兼容性問題

此訪問為http的post的請求,不訪問文件,不查詢數據庫,請求統一為utf-8不涉及編碼問題,暫時排除代碼問題

檢測是否平台環境問題

j通過搜索發現問java環境問題

解決:

java使用yum安裝未設置java環境變量,但java -version正常執行

開始設置環境變量,設置完成 仍不能正常工作

配置並指定sunjce_provider.jar和jce.jar的classpath路徑

$JAVA_HOME/lib/ext/sunjce_provider.jar:$JAVA_HOME/lib/jce.jar

並在security/java.security文件設置

security.provider.1=com.sun.crypto.provider.SunJCE
security.provider.2=sun.security.provider.Sun
security.provider.3=sun.security.rsa.SunRsaSign
security.provider.4=sun.security.ec.SunEC
security.provider.5=com.sun.net.ssl.internal.ssl.Provider
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC

完成后,重新啟動服務,問題依舊

再搜索 從官網上下載 並替換security下 local_policy.jar 和 US_export_policy.jar

完成后,重新啟動服務,問題依舊

百思不得其解,於是對比了本地的JRE下項目所引用的jar包,發現和服務器JRE的lib/ext下少包,於是復制jaccess.jar、sunec.jar和sunmscapi.jar至服務器JRE下lib/ext

下。問題解決。

 

總結:首先,需要錯誤的正確定位,再次,確認真正引起錯誤的原因

還有,不了解HttpClient的功能

http://blog.csdn.net/liuyanghai/article/details/7191537

 參考下面一段話:

產出密鑰時經常會出現java.security.NoSuchAlgorithmException異常。如下面代碼,在elipse中編譯通過,但運行時會拋出java.security.NoSuchAlgorithmException異常
KeyGenerator keyGen=null;
keyGen = KeyGenerator.getInstance("DES");
keyGen.init(56);
Key key = keyGen.generateKey();
網上關於這個問題的解答不多,已有的一般是說java.security.Provider
是個abstract class,sun沒有將它實現,就像jdbc一樣由提供商提供;還有就是說關於密鑰這一塊USA對我們封鎖,我們下的jdk里不帶;還有就是說要往%javahome%/lib/security/java.security里添加security.provider.1=com.sun.crypto.provider.SunJCE;要確保在classpath里能找到com.sun.crypto.provider.SunJCE;用IBMJDK1.4就沒有問題。
根據jdk的文檔,從1.4開始就把jce集成起來了,而且在%javahome%/lib/ext里的確存在sunjce_provider.jar,里面包含了com.sun.crypto.provider.SunJCE。在elipse里運行時拋出異常的原因是,class在eclipse里運行時,是通過eclipse的進行classload時會把com.sun.crypto.provider.SunJCE的簽名信息去掉,這樣JCE就不認這個類了,導致找不到Provider的實現,解決辦法:在eclipse的preferences->java->installed jres里選擇你指定的jre,edit,將Use default system libraries選上就可以正常運行了。其實把上面的程序在eclipse里編譯好,直接在命令行下run,是不會出現上面的問題的。
在eclipse里,IBMjdk可以正常使用,可能是他們密切關系的原因吧,呵呵!
在其它的一些情況下拋出java.security.NoSuchAlgorithmException的話,也可以考慮是不是在通過其它的程序進行classload時去掉了簽名信息。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM