2012-04-08 6 views
1

내 httpclient 프로젝트에서 java1.6을 사용하는 다른 두 CentOS 시스템에서 이상한 문제가 발생했습니다. 하지만 다른 시스템 (centos 및 java1.6)에서는 실패했습니다. 문제는 다음과 같습니다기본 SSL 컨텍스트 초기화 실패

 
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

가 여기에 단서 말을해야 당신이 자바 6를 사용하고 있는지 확인해야합니다 gnu.javax.net.ssl.provider'에서 IllegalStateException''에 의해 발생. X509KeyManagerFactory.engineGetKeyManagers'를'libgcj.so.10'에 추가합니다. –

+0

나 자신을 위해, 나는 단지 "gcj라고 생각하니? 바로 거기에 문제가 있습니다! "하지만 당신에게 유용한 대답이 아닌 것 같습니다 ... –

+0

문제가 해결되었습니다. javac의 버전은 1.5이지만 open-jdk는 버전 1.6입니다. 버전과 일치하면 문제가 사라집니다. – lujingsun

답변

2

난 당신이 (원인 예외가 gnu.javax.net.ssl.provider.X509KeyManagerFactory 클래스에서 유래한다는 사실에서, 많은 스택 수준이 libgcj.so.10에하는 방식) 자바의 실행으로 GCJ를 사용하고있는 것을 알 수있다. 불행히도 공식적으로 승인 된 Java 버전은 아닙니다. 구현의 몇 가지 영역에서 여러 가지 문제가 있으며 때로는 매우 어려울 수 있습니다. 특히 X.509 키 처리에 문제가있는 것으로 보입니다! (나는 알지 못했습니다. 분명히 않습니다.)

가장 간단한 해결 방법은 다른 Java 구현을 사용하는 것입니다. Sun/Oracle Java 구현은 확실히 훌륭합니다 (광범위하게 사용합니다). OpenJDK 구현에 대해서도 좋은 소식을 들었습니다. OpenJDK는 일부 부품이 제거 된 Sun JDK입니다 (특히 다른 곳에서 라이센스 한 비트 인 을 코덱 및 GUI 코드로 간주하지만 확실하지는 않습니다). 당신이 원하지 않는 일은 아무도 사용을 권장하지 않는 Java 구현에서 버그를 해결하는 데 시간을 투자하는 것입니다!

+0

또한 gcj가 1.6 API를 구현했는지도 몰랐습니다. 더 의심 스럽네요. –

5

귀하의 잘못이 아닙니다. 다른 JVM을 사용하면 문제를 해결할 수 있습니다. 나는 똑같은 문제가 있었다. Gumstix/linux/jamVM에서 Apache HttpClient를 실행하고 있습니다. 나는 똑같은 예외를 가지고있다. 다음은 X509 용 테스트 프로그램입니다. 내 Mac mini에서 실행했는데 그 결과는 "SunX509"알고리즘입니다. 그러나 jamVM에서는 'null'입니다. 시도 해봐. gnu.javax.net.ssl.provider.X509KeyManagerFactory.java 라인 (108)의

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

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

참조 소스. 여기에서 예외가 발생합니다. ('현재'가 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.

0

답변은 의견에 있습니다. 당신이 java -version를 입력하고 java version "1.5.0"를 볼 경우, 당신은 java version "1.6.0"