Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> JVM, security. Конфликт 2ух приложений... Использующих криптографию 
V
    Опции темы
olegrolik
Дата 24.8.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 25.1.2006

Репутация: нет
Всего: нет



На apache tomcat установлены два приложения, app и test. Оба приложения являются одинаковыми по своей архитектуре (да и вообще одинаковые, используют лишь только разную конфигурацию). app и test занимаются расшифровкой файла, для этого используется security JVM. Т.к. виртуальная машина одна, security используется обоими приложениями, в результате чего возникает проблема приложения, которое последним задействует эту самую секьюрити виртуальной машины - расшифровка файла не работает. 
Что посоветуете сделать? Ставить вторую JVM не хочется (да и можно ли так сделать?). 
Спасибо.
PM MAIL   Вверх
olegrolik
Дата 25.8.2007, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 25.1.2006

Репутация: нет
Всего: нет



У меня тут появилась такая мысль:
В приложении (при расшифровке) используется следующий код:
Код

java.security.Security
                .addProvider(new cryptix.jce.provider.CryptixCrypto());

        java.security.Security
                .addProvider(new cryptix.openpgp.provider.CryptixOpenPGP());

 
В документации я нашёл следующие строки: 
Код

The Security class manages installed providers and security-wide properties. It only contains static methods and is never instantiated.

Типа класс Security статический и не имеет экземпляров (если не так, поправьте). Значит при использовании этого класса в двух местах (двумя приложениями) будет происходить конфликт.
Значит можно наверное использовать синхронизацию, чтобы сделать доступ к нему по очереди. Верно?

Это сообщение отредактировал(а) olegrolik - 25.8.2007, 19:27
PM MAIL   Вверх
Alexandr87
Дата 27.8.2007, 07:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 9
Всего: 39



Нужно больше конкретики, что пишется в логи tomcat`а? Не мешало бы указать в первом посте, что используется не Java криптопровайдер, а cryptix. Привести исходные код.

С криптиксом не работал, но SUNовский криптопровайдер не должен выдавать таких бяк. Вобсчем нужна информация.
PM Jabber   Вверх
olegrolik
Дата 27.8.2007, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 25.1.2006

Репутация: нет
Всего: нет



Alexandr87, спасибо, что откликнулся. 
1) "что пишется в логи tomcat'a?"
Если ты об ошибке, то она имеет следующий вид
Код

java.lang.InternalError: Key was invalid
    at cryptix.openpgp.algorithm.PGPElGamal.decrypt(PGPElGamal.java:660)
    at cryptix.openpgp.packet.PGPPublicKeyEncryptedSessionKeyPacket.decrypt(PGPPublicKeyEncryptedSessionKeyPacket.java:189)
    at cryptix.openpgp.provider.PGPEncryptedMessageImpl.decrypt(PGPEncryptedMessageImpl.java:186)
    at cryptix.openpgp.provider.PGPEncryptedMessageImpl.decrypt(PGPEncryptedMessageImpl.java:315)
    at com.*******.***.******.service.crypt.PGPCryptoService.decrypt(PGPCryptoService.java:254)
    at com.*******.***.******.service.crypt.PGPCryptoService.decryptAndVerify(PGPCryptoService.java:399)
    at com.*******.***.******.tasks.DecryptTask.process(DecryptTask.java:52)
    at com.*******.***.******.dispatchers.BasicDispatcher.processData(BasicDispatcher.java:83)
    at com.*******.***.******.dispatchers.BasicDispatcher.dataArrived(BasicDispatcher.java:71)
    at com.*******.***.******.datastores.BasicDataStore.fireDataArrivedEvent(BasicDataStore.java:36)
    at com.*******.***.******.dispatchers.MailDispatcher.processMessage(MailDispatcher.java:91)
    at com.*******.***.******.dispatchers.MailDispatcher.processMessagesFromAgent(MailDispatcher.java:197)
    at com.*******.***.******.dispatchers.MailDispatcher.processMessages(MailDispatcher.java:112)
    at com.*******.***.******.dispatchers.MailDispatcher.doJob(MailDispatcher.java:326)
    at com.*******.***.******.AbstractManagedThread.run(AbstractManagedThread.java:75)
    at com.*******.***.******.AbstractManagedThread.access$000(AbstractManagedThread.java:20)
    at com.*******.***.******.AbstractManagedThread$1.run(AbstractManagedThread.java:116)
    at java.lang.Thread.run(Unknown Source)


2) Извини, как-то углубился в проблему и не подумал, что необходимо указать именно cryptix.
3) Исходный код расшифровки. Не думаю, что он необходим, т.к. по отдельности всё работает отлично! Я точно знаю в чём проблема. Проблема в классе java.security.Security.
Уверен я по следующей причине: В одном из приложений, добавил следующий код:
Код

java.security.Provider[] providers = java.security.Security.getProviders();
        for (int i = 0; i < providers.length; i++) {
            if (providers[i].getName().equals((new
                cryptix.jce.provider.CryptixCrypto()).getName())
                    || providers[i].getName().equals((new
                cryptix.openpgp.provider.CryptixOpenPGP()).getName())) {
                    java.security.Security.removeProvider(providers[i].getName());
            }
        }
java.security.Security
                 .addProvider(new cryptix.jce.provider.CryptixCrypto());
java.security.Security
                 .addProvider(new cryptix.openpgp.provider.CryptixOpenPGP());


После запуска этого приложения, всё заработало, но при этом упало первое.
Пробовал запускать два приложения с таким добавлением - та же проблема :(
PM MAIL   Вверх
Alexandr87
Дата 28.8.2007, 07:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 9
Всего: 39



Цитата(olegrolik @  27.8.2007,  12:17 Найти цитируемый пост)

Код

java.security.Security
                 .addProvider(new cryptix.jce.provider.CryptixCrypto());
java.security.Security
                 .addProvider(new cryptix.openpgp.provider.CryptixOpenPGP());


Попробуйте сделать это один раз. Т.е. вызывать данные операторы не в каждом из приложений, а в одном, или вообще в отдельном модуле при старте апача.


Цитата(olegrolik @  27.8.2007,  12:17 Найти цитируемый пост)
Не думаю, что он необходим,

Я думаю, что не помешает.
PM Jabber   Вверх
olegrolik
Дата 28.8.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 25.1.2006

Репутация: нет
Всего: нет



Цитата(Alexandr87 @ 28.8.2007,  07:26)
Цитата(olegrolik @  27.8.2007,  12:17 Найти цитируемый пост)

Код

java.security.Security
                 .addProvider(new cryptix.jce.provider.CryptixCrypto());
java.security.Security
                 .addProvider(new cryptix.openpgp.provider.CryptixOpenPGP());


Попробуйте сделать это один раз. Т.е. вызывать данные операторы не в каждом из приложений, а в одном, или вообще в отдельном модуле при старте апача.


Цитата(olegrolik @  27.8.2007,  12:17 Найти цитируемый пост)
Не думаю, что он необходим,

Я думаю, что не помешает.

К сожалению это не помогает.
Кстати, забыл сказать, что код первого приложения изменять нельзя.
PM MAIL   Вверх
olegrolik
Дата 28.8.2007, 19:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 25.1.2006

Репутация: нет
Всего: нет



Код

public Message decrypt(EncryptedMessage msg, String repAlias,
            char[] password) throws UnsupportedOperationException,
            UnrecoverableKeyException, NotEncryptedToParameterException,
            MessageException, KeyStoreException {

        // Для обеспечения threadsafety метода
        Map keyStoresFilePath = new HashMap();
        synchronized (this.keyStoresFilePath) {
            keyStoresFilePath.putAll(this.keyStoresFilePath);
        }

        Map keyStores = new HashMap();
        synchronized (this.keyStores) {
            keyStores.putAll(this.keyStores);
        }

        // Прежде всего, нужно получить закрытый ключ, с помощью которого
        // мы будем осуществлять расшифровку сообщений из DecryptSource.
        // Сам ключ храниться в соответствующем хранилище ключей KeyStore.
        // Выбор ключа из хранилища определяется коллекцией представителей
        // (representatives) из agent'а (агент - это участник обмена)
        KeyBundle privateKey;
        ExtendedKeyStore keyStore;

        Message resultMsg = null;

        try {
            keyStore = getKeyStore(getPrivateKeyRing(), null);
        } catch (Exception e) {
            throw new RuntimeException(
                    "критическая ошибка при получении хранилища ключей "
                            + getPrivateKeyRing()
                            + " \n для провайдера openPGP ", e);
        }

        //        String alias;

        //        if (agent.getRepresentatives().isEmpty())
        //            throw new IllegalArgumentException ("для агента "+agent.getName()+"
        // не указано ни одного представителя!");

        //        alias = (String) agent.getRepresentatives().iterator().next();

        if (keyStore.containsAlias(repAlias)) {
            privateKey = keyStore.getKeyBundle(repAlias);

        } else
            throw new RuntimeException("Ключ с алиасом " + repAlias
                    + " в хранилище ключей " + getPrivateKeyRing()
                    + " отсутсвует");
        //        }

        // Выполняем непосредственную расшифровку сообщения, используя наш
        // закрытый ключ
        resultMsg = msg.decrypt(privateKey, password);

        return resultMsg;
    }

    /**
     * <b>verify </b> выполняет проверку подписи используя открытые ключи
     * асоциированные с address'ом
     * 
     * <b>Метод полностью threadsafe </b>
     * 
     * @param repAliases
     * @param signedMsg
     * @return
     * @throws KeyStoreException
     * @throws MessageException
     */
    public Message verify(List repAliases, SignedMessage signedMsg)
            throws KeyStoreException, MessageException {
        // Для обеспечения threadsafety метода
        Map keyStoresFilePath = new HashMap();
        synchronized (this.keyStoresFilePath) {
            keyStoresFilePath.putAll(this.keyStoresFilePath);
        }

        Map keyStores = new HashMap();
        synchronized (this.keyStores) {
            keyStores.putAll(this.keyStores);
        }

        // получаем хранилище ключей
        Message resultMsg = null;
        ExtendedKeyStore keyStore;
        try {
            keyStore = getKeyStore(getPublicKeyRing(), null);
        } catch (Exception e) {
            throw new RuntimeException(
                    "критическая ошибка при получении хранилища ключей "
                            + getPublicKeyRing()
                            + " \n для провайдера openPGP ");
        }

        // У каждого адреса существует список представителей, имеющих право
        // подписывать отправляемые на адрес платежи. Поэтому необходимо
        // проверить принадлежит ли
        // подпись данного сообщения одному из этих лиц.

        for (java.util.Iterator it = repAliases.iterator(); resultMsg == null
                && it.hasNext();) {

            // Получаем набор ключей текущего представителя
            KeyBundle keyBundle;
            //            try {

            String alias = (String) it.next();
            if (keyStore.containsAlias(alias)) {
                keyBundle = keyStore.getKeyBundle(alias);
            } else {
                throw new KeyStoreException("Представитель с алиасом " + alias
                        + " не найден в хранилище ключей ");
//                logger.warn("Представитель с алиасом " + alias
//                        + " не найден в хранилище ключей ");
                //                        + agent.getName() + " не найден в хранилище ключей "
                //                        + agent.getSecurityKeyRingName());
//                continue;
            }

            // Проверяем подпись
            if (signedMsg.verify(keyBundle)) {
                resultMsg = signedMsg.getContents();
                break;
            }
        }
        return resultMsg;
    }

    public Map getKeyStoresFilePath() {
        return keyStoresFilePath;
    }

    public void setKeyStoresFilePath(Map keyStoresFilePath) {
        this.keyStoresFilePath = keyStoresFilePath;
    }

    public InputStream decryptAndVerify(InputStream is,
            Agent privAgent, Agent pubAgent,
            boolean allowNotEncrypted,
            boolean allowNotSigned) throws WrongFormatException,
            DecryptFailedException, NotEncryptedException, NotSignedException, BadSignatureException {

        java.security.Security
                .addProvider(new cryptix.jce.provider.CryptixCrypto());

        java.security.Security
                .addProvider(new cryptix.openpgp.provider.CryptixOpenPGP());


        InputStream result;
        try {
            //**********************************************************************
            //  Читаем сообщение
            //**********************************************************************
            Message msg;
            try {
                MessageFactory mf = null;
                Collection msgs;

                mf = MessageFactory.getInstance("OpenPGP");

                msgs = mf.generateMessages(is);

                if (msgs.isEmpty())
                    throw new WrongFormatException(
                            "отсутствуют данные для расшифровки");

                msg = (Message) msgs.iterator().next();
                logger.debug("cryptixPGP считает что данные типа "
                        + msg.getClass().getName());
            } catch (Exception e) {
                e.printStackTrace();

                logger.debug(e);
                throw new WrongFormatException(
                        "ошибка при чтении зашифрованного сообщения. сообщение не содержит зашифрованные данные!",
                        e);
            }

            // Выполняем непосредственную расшифровку сообщения, используя наш закрытый ключ

            if (msg instanceof EncryptedMessage) {
                if (privAgent.getRepresentatives().isEmpty())
                    throw new RuntimeException(
                            "Требуется указать закрытый ключ для агента "
                                    + privAgent.getName());

                try {
                    msg = decrypt((EncryptedMessage) msg, (String) privAgent
                            .getRepresentatives().iterator().next(),
                            getPrivateKeyRingPassword());

                } catch (UnsupportedOperationException e) {
                    throw new RuntimeException(e);
                } catch (UnrecoverableKeyException e) {
                    throw new RuntimeException(e);
                } catch (KeyStoreException e) {
                    throw new RuntimeException(e);
                } catch (NotEncryptedToParameterException e) {
                    throw new DecryptFailedException(
                            "сообщение зашифровано НЕ для нашего закрытого ключа!");
                } catch (MessageException e) {
                    throw new WrongFormatException(
                            "Не удалось расшифровать данные так как они записаны в неверном формате");
                }

            } else {
                logger.info("Часть письма содержала не зашифрованные данные");
                if (!allowNotEncrypted)
                    throw new NotEncryptedException();
            }

            // Проверяем подпись
            if (msg instanceof SignedMessage) {

                try {
                    msg = verify(pubAgent.getRepresentatives(),
                            (SignedMessage) msg);
                } catch (KeyStoreException e) {
                    throw new RuntimeException(e);
                } catch (MessageException e) {
                    throw new WrongFormatException(e);
                }

                if (msg == null)
                    throw new BadSignatureException();

            } else {
                logger
                        .info("Часть письма содержала, успешно расшифрованные, данные, которые не были подписаны");
                if (!allowNotSigned) {
                    throw new NotSignedException();

                }

            }

            // Возвращаем входной поток, указывающий на расшифрованные и проверенные
            // данные
            if (!(msg instanceof LiteralMessage))
                throw new WrongFormatException(
                        "Расшифрованное сообщение содержит не текстовые данные");

            try {
                result = ((LiteralMessage) msg).getBinaryDataInputStream();
            } catch (UnsupportedOperationException e) {
                throw new RuntimeException(e);
            } catch (MessageException e) {
                throw new RuntimeException(e);

            }
        } finally {
            IOUtils.closeQuietly(is);
        }
        return result;

    }


Это сообщение отредактировал(а) olegrolik - 28.8.2007, 19:55
PM MAIL   Вверх
Alexandr87
Дата 30.8.2007, 18:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


дыкий псых
***


Профиль
Группа: Завсегдатай
Сообщений: 1459
Регистрация: 27.11.2004
Где: Алматы, Казахстан

Репутация: 9
Всего: 39



Я так понял, проблемма разрешилась? http://forum.vingrad.ru/forum/topic-169847.html 

PM Jabber   Вверх
olegrolik
Дата 30.8.2007, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 309
Регистрация: 25.1.2006

Репутация: нет
Всего: нет



Ага smile Отписаться сюда не смог, форум в дауне был.
Спасибо всем за помощь!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0523 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.