저는 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 "";
}
}
}
Java 보안 특성 파일'$ JAVA_HOME/lib/security/java.security'를 제공 할 수 있습니까? –