1

私のhttpclientプロジェクトで奇妙な問題が発生しました。java1.6を使用する他の2つの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] simulativeLogin.WebClientDevWrapper.wrapClient(不明なソース)
     [java] simulativeLogin.GetAccessToken.getToken(不明なソース)
     [java] at クローラー.FriendshipCrawler.main(不明なソース)
     [java] at 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] at 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] at gnu.javax.net.ssl.provider.X509KeyManagerFactory.engineGetKeyManagers(libgcj.so.10)
     [java] java.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 では「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:

ライブラリは RuntimeException である IllegalStateException をスローするため、一部の人はこれを GCJ のバグと見なし、http: //code.google.com/p/selenium/issues/detail?id=2483 で報告しました。

于 2012-11-02T22:38:28.237 に答える
2

Java の実装として GCJ を使用していることがわかります (原因例外が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 に答える