初始化失败默认的SSL上下文( Failure initializing default SSL c

2019-10-16 14:03发布

我HttpClient的项目遇到。它成功地运行在java1.6另外两个Centos的系统一个奇怪的问题。 但在另一台机器(CentOS的和java1.6)失败。 问题是:

java.lang.IllegalStateException: Failure initializing default SSL context
     [java]    at org.apache.http.conn.ssl.SSLSocketFactory.createDefaultSSLContext(SSLSocketFactory.java:211)
     [java]    at org.apache.http.conn.ssl.SSLSocketFactory.(SSLSocketFactory.java:333)
     [java]    at org.apache.http.conn.ssl.SSLSocketFactory.getSocketFactory(SSLSocketFactory.java:165)
     [java]    at org.apache.http.impl.conn.SchemeRegistryFactory.createDefault(SchemeRegistryFactory.java:45)
     [java]    at org.apache.http.impl.client.AbstractHttpClient.createClientConnectionManager(AbstractHttpClient.java:294)
     [java]    at org.apache.http.impl.client.AbstractHttpClient.getConnectionManager(AbstractHttpClient.java:445)
     [java]    at simulativeLogin.WebClientDevWrapper.wrapClient(Unknown Source)
     [java]    at simulativeLogin.GetAccessToken.getToken(Unknown Source)
     [java]    at crawler.FriendshipCrawler.main(Unknown Source)
     [java]    at java.lang.reflect.Method.invoke(libgcj.so.10)
     [java]    at org.apache.tools.ant.taskdefs.ExecuteJava.run(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.taskdefs.ExecuteJava.execute(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.taskdefs.Java.run(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.taskdefs.Java.executeJava(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.taskdefs.Java.executeJava(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.taskdefs.Java.execute(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.UnknownElement.execute(ant-1.7.1.jar.so)
     [java]    at java.lang.reflect.Method.invoke(libgcj.so.10)
     [java]    at org.apache.tools.ant.dispatch.DispatchUtils.execute(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.Task.perform(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.Target.execute(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.Target.performTasks(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.Project.executeSortedTargets(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.Project.executeTarget(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.Project.executeTargets(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.Main.runBuild(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.Main.startAnt(ant-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.launch.Launcher.run(ant-launcher-1.7.1.jar.so)
     [java]    at org.apache.tools.ant.launch.Launcher.main(ant-launcher-1.7.1.jar.so)
     [java] Caused by: java.lang.IllegalStateException
     [java]    at gnu.javax.net.ssl.provider.X509KeyManagerFactory.engineGetKeyManagers(libgcj.so.10)
     [java]    at javax.net.ssl.KeyManagerFactory.getKeyManagers(libgcj.so.10)
     [java]    at org.apache.http.conn.ssl.SSLSocketFactory.createSSLContext(SSLSocketFactory.java:187)
     [java]    at org.apache.http.conn.ssl.SSLSocketFactory.createDefaultSSLContext(SSLSocketFactory.java:209)

Answer 1:

这不是你的错。 使用另一个JVM,这将解决您的问题。 我有同样的问题。 我跑在Gumstix / LINUX / jamVM Apache的HttpClient的。 我得到了完全相同的例外。 下面是X509测试程序。 我跑在我的Mac mini上,结果是“SunX509”的算法; 但jamVM,它是“空”。 试试吧。

public class TestX509 {
    public static void main(String[] args) {
        String algorithm = Security
            .getProperty("ssl.KeyManagerFactory.algorithm");

        System.out.println("algorithm is " + algorithm);
    }
}

见gnu.javax.net.ssl.provider.X509KeyManagerFactory.java的108线的来源。 这是异常的来源。 (因为“当前”是一个关键的管理器,它是空的。你知道,从前面的测试。)

104:   protected KeyManager[] engineGetKeyManagers()
105:   {
106:     if (current == null)
107:       {
108:         throw new IllegalStateException();
109:       }
110:     return new KeyManager[] { current };
111:   }
112:

由于库抛出IllegalStateException异常,这是一个RuntimeException,有人认为它是GCJ的一个bug,这里报道它http://code.google.com/p/selenium/issues/detail?id=2483 。



Answer 2:

我看到你正在使用GCJ如Java的实现(从事实的原因异常的起源gnu.javax.net.ssl.provider.X509KeyManagerFactory类,而且许多堆栈水平的方式libgcj.so.10 )。 不幸的是,这不是一个Java版本,我们官方认可; 它在其实施的一些领域的一些问题,有时可以咬很辛苦。 特别是,它似乎与X.509键处理问题! (我不知道它做了,但它显然不。)

最简单的解决方法是切换到使用不同的Java实现。 太阳/ Oracle的Java实现肯定是不错的(我用它广泛地),我听说过在OpenJDK执行太好的东西; 据我所知,OpenJDK的是Sun JDK去除某些部分(尤其是他们从其他地方许可的位,我认为是的编解码器和GUI代码块,但我不肯定知道)。 什么你不想做的是,没有人建议用花你的时间错误周围工作在Java中的实现!



Answer 3:

答案是在评论中。 如果你做的类型java -version ,看看java version "1.5.0" ,你需要确保你使用的是Java 6,应该说java version "1.6.0"



文章来源: Failure initializing default SSL context