• 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时去掉了签名信息。

  • 相关阅读:
    mysql 中 group_concat()用法
    MySQL行转列与列转行
    mysql中find_in_set()函数的使用(转载)
    多线程中的线程安全关键字
    架构师的特征
    算法复杂度的定义
    1.ArrayList和linkedList区别
    Plsql查询clob类型字段数据
    数据库的特性与隔离级别和spring事务的传播机制和隔离级别
    java中的线程
  • 原文地址:https://www.cnblogs.com/myfield/p/3937259.html
Copyright © 2020-2023  润新知