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時去掉了簽名信息。
