1

我的httpclient项目遇到了一个奇怪的问题。它在其他两个带有java1.6的Centos系统中运行成功。但它在另一台机器(centos 和 java1.6)上失败了。问题是:

java.lang.IllegalStateException:初始化默认 SSL 上下文失败
     [java] 在 org.apache.http.conn.ssl.SSLSocketFactory.createDefaultSSLContext(SSLSocketFactory.java:211)
     [java] 在 org.apache.http.conn.ssl.SSLSocketFactory.(SSLSocketFactory.java:333)
     [java] 在 org.apache.http.conn.ssl.SSLSocketFactory.getSocketFactory(SSLSocketFactory.java:165)
     [java] 在 org.apache.http.impl.conn.SchemeRegistryFactory.createDefault(SchemeRegistryFactory.java:45)
     [java] 在 org.apache.http.impl.client.AbstractHttpClient.createClientConnectionManager(AbstractHttpClient.java:294)
     [java] 在 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] 在 crawler.FriendshipCrawler.main(未知来源)
     [java] 在 java.lang.reflect.Method.invoke(libgcj.so.10)
     [java] 在 org.apache.tools.ant.taskdefs.ExecuteJava.run(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.taskdefs.ExecuteJava.execute(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.taskdefs.Java.run(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.taskdefs.Java.executeJava(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.taskdefs.Java.executeJava(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.taskdefs.Java.execute(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.UnknownElement.execute(ant-1.7.1.jar.so)
     [java] 在 java.lang.reflect.Method.invoke(libgcj.so.10)
     [java] 在 org.apache.tools.ant.dispatch.DispatchUtils.execute(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.Task.perform(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.Target.execute(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.Target.performTasks(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.Project.executeSortedTargets(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.Project.executeTarget(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.helper.DefaultExecutor.executeTargets(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.Project.executeTargets(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.Main.runBuild(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.Main.startAnt(ant-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.launch.Launcher.run(ant-launcher-1.7.1.jar.so)
     [java] 在 org.apache.tools.ant.launch.Launcher.main(ant-launcher-1.7.1.jar.so)
     [java] 引起:java.lang.IllegalStateException
     [java] 在 gnu.javax.net.ssl.provider.X509KeyManagerFactory.engineGetKeyManagers(libgcj.so.10)
     [java] 在 javax.net.ssl.KeyManagerFactory.getKeyManagers(libgcj.so.10)
     [java] 在 org.apache.http.conn.ssl.SSLSocketFactory.createSSLContext(SSLSocketFactory.java:187)
     [java] 在 org.apache.http.conn.ssl.SSLSocketFactory.createDefaultSSLContext(SSLSocketFactory.java:209)
4

3 回答 3

5

这不是你的错。使用另一个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 行的源代码。这就是异常的来源。(因为 'current' 是一个密钥管理器,它是空的。你从前面的测试中知道。)

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 的错误并在此处报告http://code.google.com/p/selenium/issues/detail?id=2483

于 2012-11-02T22:38:28.237 回答
2

我看到您使用 GCJ 作为 Java 的实现(从原因异常起源于gnu.javax.net.ssl.provider.X509KeyManagerFactory类的事实,以及许多堆栈级别的方式libgcj.so.10)。不幸的是,这不是官方认可的 Java 版本。它在其实施的几个领域存在许多问题,有时可能会非常棘手。特别是 X.509 密钥处理似乎有问题!(我不知道确实如此,但显然确实如此。)

最简单的解决方法是切换到使用不同的 Java 实现。Sun/Oracle Java 实现绝对不错(我广泛使用它),而且我也听说过有关 OpenJDK 实现的好消息;据我了解,OpenJDK 是删除了某些部分的 Sun JDK(特别是他们从其他地方获得许可的位,我认为这是编解码器和 GUI 代码的一部分,但我不确定)。您不想做的是花时间解决没有人推荐使用的 Java 实现中的错误!

于 2012-04-10T10:58:43.950 回答
0

答案在评论中。如果您确实键入java -version并查看java version "1.5.0",则需要确保您使用的是 Java 6。它应该说java version "1.6.0"

于 2012-12-10T20:41:23.647 回答