2015-01-19 2 views
1

저는 Linux (x86)에서 실행되는 Java로 작성된 프로그램을 수년 동안 사용해 왔으며 현재 Linux (ARM)에서 작동하도록 이식하고 있습니다. 나는 쟁점에 직면하고 있으며 어디에서 왔는지 확신하지 못한다. OpenJDK에서의 HTTP SSL 요청 문제 ARM

는 완벽하게 정상적으로 실행

# java -version 
java version "1.6.0_11" 
Java(TM) SE Runtime Environment (build 1.6.0_11-b03) 
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing) 

으로 슬랙웨어 12.1 (86)의 예를 실행합니다.

# java -version 
java version "1.7.0_13" 
OpenJDK Runtime Environment (IcedTea7 2.3.6) (Slackware) 
OpenJDK Zero VM (build 22.0-b10, mixed mode) 

으로 슬랙웨어 14.1 (ARM)에서 실행 때 나는 예외가 :

# java -jar SpectoTechnologies_TestHTTP.jar 
java.security.ProviderException: Error parsing configuration 
     at sun.security.pkcs11.Config.getConfig(Config.java:88) 
     at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:128) 
     at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:103) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 
     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
     at java.lang.reflect.Constructor.newInstance(Constructor.java:525) 
     at sun.security.jca.ProviderConfig$2.run(ProviderConfig.java:224) 
     at sun.security.jca.ProviderConfig$2.run(ProviderConfig.java:206) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at sun.security.jca.ProviderConfig.doLoadProvider(ProviderConfig.java:206) 
     at sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:187) 
     at sun.security.jca.ProviderList.getProvider(ProviderList.java:232) 
     at sun.security.jca.ProviderList$ServiceList.tryGet(ProviderList.java:433) 
     at sun.security.jca.ProviderList$ServiceList.access$200(ProviderList.java:375) 
     at sun.security.jca.ProviderList$ServiceList$1.hasNext(ProviderList.java:485) 
     at sun.security.jca.GetInstance.getInstance(GetInstance.java:170) 
     at javax.net.ssl.SSLContext.getInstance(SSLContext.java:156) 
     at javax.net.ssl.SSLContext.getDefault(SSLContext.java:97) 
     at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:121) 
     at javax.net.ssl.HttpsURLConnection.getDefaultSSLSocketFactory(HttpsURLConnection.java:333) 
     at javax.net.ssl.HttpsURLConnection.<init>(HttpsURLConnection.java:291) 
     at sun.net.www.protocol.https.HttpsURLConnectionImpl.<init>(HttpsURLConnectionImpl.java:85) 
     at sun.net.www.protocol.https.Handler.openConnection(Handler.java:62) 
     at java.net.URL.openConnection(URL.java:1020) 
     at com.spectotechnologies.tests.HTTP.main(HTTP.java:30) 
Caused by: sun.security.pkcs11.ConfigurationException: name must be specified 
     at sun.security.pkcs11.Config.parse(Config.java:465) 
     at sun.security.pkcs11.Config.<init>(Config.java:216) 
     at sun.security.pkcs11.Config.getConfig(Config.java:84) 
     ... 25 more 

그것은 가장 가능성이 문제입니다 오픈 JDK 대 오라클/썬 JRE와 코드 호환성 함께 할 수있는 뭔가가 .. 또는 뭔가 리눅스에서 누락 (SSL 패키지 또는 뭔가),하지만 비슷한 무언가에 대한 답변을 찾으십시오.

나는 문제를 재현하는 SSCCE을했습니다 : 구성 파일 $JAVA_HOME/lib/security/java.security을 구문 분석 할 때

package com.spectotechnologies.tests; 

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.Reader; 
import java.io.StringWriter; 
import java.io.Writer; 
import java.net.HttpURLConnection; 
import java.net.Proxy; 
import java.net.URL; 

/** 
* 
* @author Alexandre Lavoie 
*/ 
public class HTTP 
{ 
    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) 
    { 
     try 
     { 
      InputStream oInput; 
      URL oURL = new URL("https://google.com"); 

      HttpURLConnection oConnection = (HttpURLConnection)oURL.openConnection(Proxy.NO_PROXY); 

      oConnection.setDoOutput(true); 
      oConnection.setDoInput(true); 
      oConnection.setRequestMethod("GET"); 

      if(oConnection.getResponseCode() != 500) 
      { 
       oInput = oConnection.getInputStream(); 
      } 
      else 
      { 
       oInput = oConnection.getErrorStream(); 
      } 

      String sResult = convertStreamToString(oInput); 

      System.out.println(sResult); 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

    } 

    public static String convertStreamToString(java.io.InputStream is) throws IOException 
    { 
     if(is != null) 
     { 
      Writer writer = new StringWriter(); 

      char[] buffer = new char[1024]; 

      try 
      { 
       Reader reader = new BufferedReader(new InputStreamReader(is,"utf-8")); 
       int n; 

       while ((n = reader.read(buffer)) != -1) 
       { 
        writer.write(buffer, 0, n); 
       } 
      } 
      finally 
      { 
       is.close(); 
      } 

      return writer.toString(); 
     } 
     else 
     { 
      return ""; 
     } 
    } 
} 
+0

Java 보안 특성 파일'$ JAVA_HOME/lib/security/java.security'를 제공 할 수 있습니까? –

답변