我的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)
最佳答案
这不是你的错。使用另一个 JVM,这将解决您的问题。我有同样的问题。我在 Gumstix/linux/jamVM 上运行 Apache HttpClient。我得到了完全相同的异常(exception)。这是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' 是一个 key 管理器,它是空的。你从之前的测试中知道这一点。)
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 .
关于java - 初始化默认 SSL 上下文失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10063882/