Gridens - информационные технологии

Ошибка java рукопожатия клиента ssl tomcat

Ошибка: при ssl-рукопожатии с ssl-сервером. После: приветствие клиента, приветствие сервера, сертификат, обмен ключами сервера и приветствие сервера. Веб-приложения аварийно завершают работу с ошибкой java.lang.NoClassDefFoundError: Не удалось инициализировать класс javax.crypto.SunJCE_b.

Проблема возникает на:
tomcat 6.0.29

Пробовал следующую JVM:
1.5, 1.6_22, 1.6_25
сейчас работает:
java -version java version "1.6.0_25" Java(TM) SE Runtime Environment (сборка 1.6.0_25- b06) Java HotSpot(TM) Server VM (сборка 20.0-b11, смешанный режим)

Операционная система:
uname -a
имя хоста SunOS 5.10 Generic_118833-33 sun4v sparc sun4v

Подробнее:

Трассировка стека:

java.lang.NoClassDefFoundError: Could not initialize class javax.crypto.SunJCE_b
    javax.crypto.KeyGenerator.a(DashoA13*..)
javax.crypto.KeyGenerator.<init>(DashoA13*..)
javax.crypto.KeyGenerator.getInstance(DashoA13*..)
com.sun.net.ssl.internal.ssl.JsseJce.getKeyGenerator(JsseJce.java:223)
com.sun.net.ssl.internal.ssl.RSAClientKeyExchange.<init>(RSAClientKeyExchange.java:89)
com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHelloDone(ClientHandshaker.java:744)
com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:238)
com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:632)
com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:73)
com.gosselinchristian.SSLPokeServlet.doGet(SSLPokeServlet.java:86)

Код:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
    try {

        System.out.println(getClasspathString());
        System.out.println(getPropertiesString());

        SSLSocketFactory sslsocketfactory = (SSLSocketFactory) SSLSocketFactory
                .getDefault();
        SSLSocket sslsocket = (SSLSocket) sslsocketfactory.createSocket(
                "some_server", 443);

        InputStream in = sslsocket.getInputStream();
        OutputStream out = sslsocket.getOutputStream();



        // Write a test byte to get a reaction :)
        out.write(1);

        while (in.available() > 0) {
            System.out.print(in.read());
        }

        System.out.println("Successfully connected");

    } catch (Exception exception) {
        exception.printStackTrace();
    }
}

Некоторые параметры запуска tomcat:

JAVA_OPTS='-server -Dapp.name=TEST -Dfile.encoding=ISO-8859-1 -XX:PermSize=128m  -XX:MaxPermSize=128m -Xms512m -Xmx2048m -Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol -Djavax.net.ssl.trustStore=/export/home/user/some_server_certs -Djavax.net.ssl.trustStorePassword=changeit -Djavax.net.debug=all'

Тот же код, тот же jvm, тот же сертификат работает в других средах. Кто-нибудь знает, где это может пойти не так?

27.05.2011

  • Кстати, я смог исключить tomcat из уравнения, воспроизведя проблему, просто запустив класс Java в командной строке. Класс представляет собой SSLPoke, найденный здесь, и командная строка: java -Djavax.net.ssl.trustStore=. /some_server_certs -Djavax.net.debug=all SSLPoke some_server.com 443 27.05.2011

Ответы:


1

-Djava.protocol.handler.pkgs=com.sun.net.ssl.internal.www.protocol

Избавьтесь от него для начала, он устарел на семь лет. Это было только для JDK 1.3.

Что-то не так с вашей установкой JRE. Переустановите и убедитесь, что Tomcat использует только что установленную версию.

27.05.2011
  • спасибо за советы, я уже переустановил JRE с нуля сегодня вечером, используя самораспаковывающиеся двоичные файлы. Я также попробовал две другие установки JDK. 27.05.2011

  • 2

    Класс javax.crypto.SunJCE_b находится в <JAVA_HOME>/lib/jce.jar Sun JDK/JRE. В идеале он должен быть загружен загрузчиком классов начальной загрузки. Невозможность загрузить этот класс указывает на то, что что-то не так с механизмом загрузки классов для вашего веб-приложения и, возможно, для Tomcat.

    Вы можете проверить

    • если JRE/JDK содержит этот JAR.
    • если переменная CLASSPATH установлена ​​таким образом, что загружается другой архив или вообще не загружается. Этот пункт обычно не применяется, так как загрузчик классов начальной загрузки должен загружать класс, а не системный загрузчик классов (который зависит от этой переменной среды).
    • если какое-либо из ваших приложений использует методы в стиле АОП для инструментирования классов javax.crypto.*. Возможно, вы захотите настроить такое приложение, чтобы исключить эти классы (в основном) из инструментовки. Короче говоря, проверьте наличие пользовательских реализаций загрузчика классов.
    27.05.2011
  • Все JRE, которые я пробовал, содержали jce.jar. В моей последней попытке (см. Новый комментарий под вопросом) у меня нет другого пути к классам, кроме JAVA_HOME. Нет AOP, очень простой класс Java, который просто открывает SSLSocket. 27.05.2011
  • обновление, после того как системный администратор установил все последние исправления, проблема с java/ssl исчезла. Довольный. Я собирался попробовать изменить поставщика услуг безопасности, как показано здесь 28.05.2011

  • 3

    Это старый пост, но я все равно просто отвечаю, на случай, если это актуально для других, кто наткнется на это. Мы столкнулись с этой ошибкой на наших серверах, и проблема на самом деле была связана с ограничением количества открытых файлов. Проверьте лимит открытых файлов. Если это что-то вроде 1024, то у вас, вероятно, та же проблема. Увеличьте лимит открытых файлов для пользователя, от имени которого работает Tomcat.

    27.09.2011
    Новые материалы

    Журналы Py № 2: Если, Элиф, Иначе?
    У меня такое чувство, будто я давно ничего не писал, хотя прошло два дня с тех пор, как я опубликовал свою первую историю. В любом случае, сегодня произошло много всего, так что приступим...

    Работа в Реакции
    Я изучаю React в Bloc прямо сейчас. До сих пор я изо всех сил пытался понять темы. Тем не менее, я только что закончил проблему, над которой некоторое время размышлял, и хочу записать свой..

    Нужен ли банкам искусственный интеллект, чтобы кардинально изменить свою работу?
    Почему необходимо использовать искусственный интеллект в банковской сфере? Существенное использование многочисленных инноваций ИИ, таких как машинное обучение , глубокое обучение и..

    Какую последнюю статью вы считаете стоящей поделиться?
    Я люблю читать качественные статьи. Не стесняйтесь делиться своей работой.

    Преобразование CoreML, позволяющее использовать Fast-Neural-Style-Transfer на iOS и MacOS.
    Как использовать Fast-Neural-Style-Transfer на iOS Преобразованная модель: GitHub — john-rocky/CoreML-Models: Преобразованный зоопарк моделей CoreML...

    ИИ в правоохранительных органах: мощный инструмент с двойной природой
    Искусственный интеллект (ИИ) революционизирует правоохранительную деятельность, предлагая инновационные тактики расследования, повышая достоверность доказательств и оптимизируя процессы. Тем..

    Autoencoder Average Distance  — классический способ, используемый внутри Microsoft для выявления сходства…
    Среднее расстояние автоэнкодера (AAD) использует более простой подход для определения расстояния между двумя наборами данных. Нейронный автоэнкодер может преобразовать любой элемент данных в..