Я уже много лет работаю над программой, написанной на Java, работающей на Linux (x86), теперь перенося ее на работу в Linux (ARM). Я столкнулся с проблемой и не уверен, откуда она взялась.
При запуске примера на Slackware 12.1 (x86) с
# 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)
он работает отлично. При работе на Slackware 14.1 (ARM) с
# 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)
Я получаю исключение:
# 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
Скорее всего, проблема связана с несовместимость кода с Oracle/Sun JRE vs OpenJDK... или отсутствием чего-то в Linux (пакет SSL или что-то еще), но не найти ответов о чем-то подобном.
Я сделал SSCCE, чтобы воспроизвести проблему:
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_HOME/lib/security/java.security
. С этим связано несколько ошибок.
java.security.ProviderException: ошибка разбора конфигурации с пространством
sun.security.pkcs11.ConfigurationException: Неожиданное значение Токен ['(']
Я предполагаю, что у вас есть специальные символы или пробелы в файле конфигурации, которые правильно интерпретируются в одной версии jvm, а не в другой версии.
$JAVA_HOME/lib/security/java.security
?