Статус: Новичок
Группы: Участники
Зарегистрирован: 22.04.2014(UTC) Сообщений: 8 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Привет! Ситуация: JTLS, двухсторонняя SSL-аутентификация. В хранилище типа HDImageStore хранится в общей сложности 32 ключевых контейнеров. Медленно инициализируется объект KeyManager, как установленно опытным путем причем время инициалиазации линейно зависит от общего количества ключей в HDImageStore. Код выглядит так:
public class SecurityManager { private static final Logger LOG = LoggerFactory.getLogger(SecurityManager.class); private static final String KEYSTORE_TYPE = "HDImageStore"; private static final String TRUST_MANAGER_ALG = "GOSTX509"; private static final String KEY_MANAGER_ALG = "GOSTX509";
@Inject private SecurityConfig config;
public SSLContext getSSLContext(UserConfig security) { try { SSLContext sslContext = SSLContext.getInstance("GOSTTLS", Security.getProvider("JTLS")); KeyManager[] keyManagers = getKeyManager(security); sslContext.init(keyManagers, getTrustManager(), new SecureRandom()); return sslContext; } catch (GeneralSecurityException e) { throw new IllegalStateException(e); } }
private KeyManager[] getKeyManager(UserConfig security) { try { LOG.info("Initializing SSL keystore"); KeyStore keyStore = KeyStore.getInstance(KEYSTORE_TYPE); keyStore.load(null, null); KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KEY_MANAGER_ALG); String keyStorePassword = security.getKeyPass(); char[] password = keyStorePassword != null ? keyStorePassword.toCharArray() : null; keyManagerFactory.init(keyStore, password); return keyManagerFactory.getKeyManagers(); } catch (Exception e) { throw new IllegalStateException(e); } }
private TrustManager[] getTrustManager() { try { LOG.info("Initializing truststore from location: {}", config.getSslTrustStorePath()); KeyStore trustStore = KeyStore.getInstance(KEYSTORE_TYPE); InputStream inputStream = new FileInputStream(config.getSslTrustStorePath()); try { String password = config.getSslTrustStorePassword(); trustStore.load(inputStream, password != null ? password.toCharArray() : null); TrustManagerFactory factory = TrustManagerFactory.getInstance(TRUST_MANAGER_ALG); factory.init(trustStore); return factory.getTrustManagers(); } finally { inputStream.close(); } } catch (IOException e) { throw new IllegalStateException(e); } catch (GeneralSecurityException e) { throw new IllegalStateException(e); } } }
Выполняется очень медленно, если создавать для каждого запроса, то неприемлемо много - около 40 сек (у потребителей таймаут - 30 сек). Пришлось кэшировать SSLContext на старте приложения, но есть 6 настроек ключей, и тогда перезапуск занимает под 3 минуты. Главное не понятно, что творится в недрах JCP. В логах checkLicense и прочие непонятные вещи... Что я делаю не так и как можно ускорить? Отредактировано пользователем 27 мая 2014 г. 21:38:15(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Добрый день. Можно попробовать использовать SSLSocketFactoryImpl, класс кеширует контекст. Либо заранее создать контексты (подбор контейнеров происходит путем их перебора и поиска тех, которым подходит введенный пароль). |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.04.2014(UTC) Сообщений: 8 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Автор: afev ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif) Добрый день. Можно попробовать использовать SSLSocketFactoryImpl, класс кеширует контекст. Либо заранее создать контексты (подбор контейнеров происходит путем их перебора и поиска тех, которым подходит введенный пароль). SSLSocketFactoryImpl - а это как? Хотя в общем-то я и сам кэширую SSLContext, если Вы про него. Просто мне надо закэшировать 6 разных контекстов. У нас 3 ноды в кластере, и там в сумме еще дольше получается, когда приложение поднимается одновременно на всех. Дерутся они что ли за контейнеры?.. afev, а вообще это нормальное явление? Хотя бы чтобы знать, что это не у меня руки кривые...
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 4,003 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Крипто-Про Сказал(а) «Спасибо»: 21 раз Поблагодарили: 714 раз в 674 постах
|
Автор: afev ![Перейти к цитате Перейти к цитате](/forum2/Themes/soclean/icon_latest_reply.gif) подбор контейнеров происходит путем их перебора и поиска тех, которым подходит введенный пароль При переборе затрачивается время на открытие каждого контейнера, чем их больше - тем дольше инициализация. Постараемся как-нибудь ускорить подбор. |
|
![thanks](/forum2/Themes/soclean/heart_small.png) 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.04.2014(UTC) Сообщений: 8 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 22.04.2014(UTC) Сообщений: 8 ![Российская Федерация Российская Федерация](/forum2/Content/images/flags/RU.png) Откуда: Москва Сказал(а) «Спасибо»: 1 раз
|
Для тех, кто столкнется с подобной проблемой. Разрешилось все как-то само ) При переезде на новый сервер все резко ускорилось. Непонятно, что сыграло роль: или серверная железка помощнее, или сказалась новая версия JCP - с 1.0.53 -> 1.0.54. Необходимость кешировать ключи не пропала, но инициализация на одной ноде стала проходить в полне приемлемые 10-15 сек.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close