我的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)
答案 0 :(得分:5)
这不是你的错。使用另一个JVM来解决您的问题。我有同样的问题。我在Gumstix / linux / jamVM上运行Apache HttpClient。我得到了完全相同的例外。这是X509的测试程序。我在我的Mac mini上运行它,结果是“SunX509”作为算法;但是在jamVM上,它是'null'。试试吧。
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'是一个密钥管理器,它是null。你知道从之前的测试中得到的。)
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。
答案 1 :(得分: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实现中解决bug,无人建议使用!
答案 2 :(得分:0)
答案在评论中。如果您键入java -version
并查看java version "1.5.0"
,则需要确保使用的是Java 6.应该说java version "1.6.0"