Ошибка HTTP-запроса HTTP в OpenJDK ARM

1

Я уже много лет работаю над программой, написанной на 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 "";
        }
    }
}
  • 0
    Можете ли вы предоставить файл свойств Java Security: $JAVA_HOME/lib/security/java.security ?
Теги:
https
openjdk

1 ответ

0

Ошибка возникает при анализе файла конфигурации $JAVA_HOME/lib/security/java.security. С этим связано несколько ошибок.

java.security.ProviderException: ошибка разбора конфигурации с пространством

sun.security.pkcs11.ConfigurationException: Неожиданное значение Токен ['(']

Я предполагаю, что у вас есть специальные символы или пробелы в файле конфигурации, которые правильно интерпретируются в одной версии jvm, а не в другой версии.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню