Ошибка OpenJDK 11 Не удается инициализировать криптографический механизм

У меня есть приложение, написанное с помощью openJDK (Amazon Correto 11) и openJFX.

Когда я запускаю приложение локально - все работает. Но когда я запускаю приложение из общего сетевого ресурса, возникает исключение:

java.lang.ExceptionInInitializerError
    at java.base/javax.crypto.JceSecurityManager.<clinit>(JceSecurityManager.java:65)
    at java.base/javax.crypto.Cipher.getConfiguredPermission(Cipher.java:2624)
    at java.base/javax.crypto.Cipher.getMaxAllowedKeyLength(Cipher.java:2646)
    at java.base/sun.security.ssl.SSLCipher.isUnlimited(SSLCipher.java:540)
    at java.base/sun.security.ssl.SSLCipher.<init>(SSLCipher.java:472)
    at java.base/sun.security.ssl.SSLCipher.<clinit>(SSLCipher.java:174)
    at java.base/sun.security.ssl.CipherSuite.<clinit>(CipherSuite.java:67)
    at java.base/sun.security.ssl.SSLContextImpl.getApplicableSupportedCipherSuites(SSLContextImpl.java:348)
    at java.base/sun.security.ssl.SSLContextImpl$AbstractTLSContext.<clinit>(SSLContextImpl.java:579)
    at java.base/java.lang.Class.forName0(Native Method)
    at java.base/java.lang.Class.forName(Class.java:315)
    at java.base/java.security.Provider$Service.getImplClass(Provider.java:1848)
    at java.base/java.security.Provider$Service.newInstance(Provider.java:1824)
    at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:236)
    at java.base/sun.security.jca.GetInstance.getInstance(GetInstance.java:164)
    at java.base/javax.net.ssl.SSLContext.getInstance(SSLContext.java:168)
    at org.apache.http.ssl.SSLContexts.createDefault(SSLContexts.java:51)
    at org.apache.http.conn.ssl.SSLConnectionSocketFactory.getSocketFactory(SSLConnectionSocketFactory.java:194)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.getDefaultRegistry(PoolingHttpClientConnectionManager.java:115)
    at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:122)
    at com.mashape.unirest.http.options.Options.refresh(Options.java:72)
    at com.mashape.unirest.http.options.Options.<clinit>(Options.java:46)
    at com.mashape.unirest.http.HttpClientHelper.prepareRequest(HttpClientHelper.java:151)
    at com.mashape.unirest.http.HttpClientHelper.request(HttpClientHelper.java:131)
    at com.mashape.unirest.request.BaseRequest.asString(BaseRequest.java:56)
    at myapp.util.MyTaxNumberValidator$3.run(MyTaxNumberValidator.java:185)
    at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.SecurityException: Can not initialize cryptographic mechanism
    at java.base/javax.crypto.JceSecurity.<clinit>(JceSecurity.java:120)
    ... 27 more
Caused by: java.lang.SecurityException: Can't read cryptographic policy directory: unlimited
    at java.base/javax.crypto.JceSecurity.setupJurisdictionPolicies(JceSecurity.java:326)
    at java.base/javax.crypto.JceSecurity$1.run(JceSecurity.java:111)
    at java.base/javax.crypto.JceSecurity$1.run(JceSecurity.java:108)
    at java.base/java.security.AccessController.doPrivileged(Native Method)
    at java.base/javax.crypto.JceSecurity.<clinit>(JceSecurity.java:107)
    ... 27 more

Я запускаю приложение с помощью команды:

\\\some-network-share\app\jre\bin\javaw.exe -jar myapp.jar

потому что в этот сетевой ресурс я скопировал файлы Amazon Correto 11 JDK и другие библиотеки, которые я использую для приложения.

Я запускаю запрос на получение в другом потоке, и этот поток выдает исключение.

Как я могу преодолеть проблему?

Пожалуйста помоги.

Я пробовал разные библиотеки: 1. OkHttpClient 2. Java Unirest

но в обоих одна и та же ошибка.


public class MyGetExecutor {


    public static void main(String[] args) {

        Thread getThread = new Thread( new Runnable() {

            @Override
            public void run() {

                try {
                    logMessage.add( "Before request" );
                    com.mashape.unirest.http.HttpResponse<String> response = Unirest.get("https://myappserver.domain.com/api/v1/users/1")
                    .header("User-Agent", "PostmanRuntime/7.17.1")
                    .header("Accept", "*/*")
                    .header("Cache-Control", "no-cache")
                    .header("Postman-Token", "abf4b45d-a2c5-4f53-b4e3-1fa29643d616,e59130fc-5ce0-4b70-af48-ab3808362e36")
                    .header("Host", "wf01.cdprojektred.com")
                    .header("Accept-Encoding", "gzip, deflate")
                    .header("Cookie", "JSESSIONID=2C71F035C2EDFF145FED5C03C4887EF1")
                    .header("Connection", "keep-alive")
                    .header("cache-control", "no-cache")
                    .asString();
                    logMessage.add( "After request" );
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    logMessage.add( "Exception in getThread: " + e.getMessage() );
                }


            }

        }, "Get-thread");
        getThread.setUncaughtExceptionHandler(
                new Thread.UncaughtExceptionHandler() {
                    @Override
                    public void uncaughtException(Thread t, Throwable e) {
                        logMessage.add( "Error in thread: " + e );
                        logMessage.add( "Details: " + e.getCause().getMessage() );
                    }
                }
            );
        getThread.start();

        while( getThread.isAlive() ) {

            try {
                Thread.sleep(1000);
                logMessage.add("Main thread sleeping...");
            } catch (Exception e) {
                logMessage.add("Exception in main thread...: " + e.getMessage());
            }



        }

    }
}

EDIT 1 Я добавил дополнительную трассировку стека - проверьте


person user7374044    schedule 01.10.2019    source источник
comment
Stacktrace содержит полную информацию об исключении. Используйте e.printStackTrace(), чтобы не потерять интересующую вас информацию.   -  person Kayaman    schedule 01.10.2019
comment
Как сказал @Kayaman, отредактируйте свой вопрос, включив в него полную трассировку, а не только первые две строки.   -  person kenny_k    schedule 01.10.2019
comment
@kenny_k изменился - пожалуйста, проверьте   -  person user7374044    schedule 01.10.2019


Ответы (1)


Подсказка находится в последней причине в вашей трассировке стека:
Caused by: java.lang.SecurityException: Can't read cryptographic policy directory: unlimited

в кроличью нору:

  • Проверьте, откуда берутся ваши политики безопасности, проверив java.security.properties из работающей JVM:

    System.getProperty("java.security.properties");
    

    Он должен присутствовать и указывать на файл. Проверьте этот файл и убедитесь, что он имеет следующее свойство crypto.policy=unlimited и папка с именем unlimited доступна из того места, где находится файл политики. В самом файле политики должно быть пояснено, где искать эту папку.

    Для Коретто это <jre_home>/conf/security/policy/

  • Вы можете изменить расположение политики безопасности, запустив JVM и передав ей расположение файла политики:
    java -Djava.security.properties==/conf/security/java.security
    ИЛИ
    java -Djava.security.properties=/conf/security/java.security

    Дополнительный =sign в первом случае заставит Java использовать только свойства в файле, на который вы указываете.
    Второй вариант добавит/обновит свойства, определенные в файле.

  • Наконец, вам нужно покопаться в Correto 11, чтобы найти файл политики.
    Указанные выше пути взяты из amazon-corretto-11.0.3.7.1-linux-x64.tar.gz
person diginoise    schedule 01.10.2019
comment
Спасибо - это решение сработало для меня! Я повторно загрузил amazon corretto JDK и скопировал его в сетевой ресурс. После этого - никаких проблем. - person user7374044; 01.10.2019