Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Алексей Черенцов  
#1 Оставлено : 17 июля 2020 г. 10:17:07(UTC)
Алексей Черенцов

Статус: Активный участник

Группы: Участники
Зарегистрирован: 30.10.2019(UTC)
Сообщений: 56
Российская Федерация
Откуда: Новосибирск

Сказал(а) «Спасибо»: 14 раз
Здравствуйте. Разбираюсь как обходить проблему смены имени хранилища при подключении нескольких рутокенов. Имеется ввиду, когда имена меняются с RutokenStore на RutokenStore_3945665 и обратно. Пришел к выводу, что лучше перебирать рутокеновские хранилища через объект RutokenStore и брать из него имя и серийник посредством RutokenStore.getStoreName(i) и RutokenStore.getStoreSerial(i). Но вот беда, после команды keyStore.getCertificate(alias):

Цитата:

KeyStore keyStore = KeyStore.getInstance(STORE_TYPE);
keyStore.load(null, pwd.toCharArray());
Certificate cert = keyStore.getCertificate(alias);


команда RutokenStore.getStoreName(0) выдаёт null. А до выполнения команды keyStore.getCertificate(alias) выдаёт правильное название стораджа. В дебагере можно увидеть, что коллекция RutokenStore.a при этом становится размером ноль.
В чём может быть дело?

Отредактировано пользователем 17 июля 2020 г. 11:02:39(UTC)  | Причина: Не указана

Offline Elvira Borodina  
#2 Оставлено : 18 июля 2020 г. 17:51:11(UTC)
Elvira Borodina

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 24.04.2018(UTC)
Сообщений: 24
Российская Федерация

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 9 раз в 6 постах
Добрый день!
Стандартный метод получения имен хранилищ Rutoken - через функцию getServices (именно этот метод и указан в нашей документации).
Вот примерный код получения списка хранилищ:

Код:

        JCP prov = new JCP();
        Set<Provider.Service> services = prov.getServices();

        Vector<String> storeTypes = new Vector();
        for (Provider.Service service : services) {

            String serviceName = service.getType();
            String algorithm = service.getAlgorithm();

            if (serviceName.equals("KeyStore") && algorithm.contains("Rutoken")) {
                storeTypes.add(algorithm);
            } // if

        }


Соответственно, далее вы разбираете: если элемент в списке один (то есть токен один), то это будет "RutokenStore".
Если токенов несколько, то список будет состоять из имен формата "RutokenStore_серийныйномер».

Функции, указанные вами, не предназначались для такого внешнего использования (они используются в рамках JCP).
Но особенность, обнаруженная вами, интересная.
Не могли бы Вы прислать код полностью, в частности, как Вы создаете объект RutokenStore (этот класс абстрактный, напрямую вызов функций не предусмотрен)?

Отредактировано пользователем 18 июля 2020 г. 17:55:57(UTC)  | Причина: Не указана

thanks 2 пользователей поблагодарили Elvira Borodina за этот пост.
Санчир Момолдаев оставлено 18.07.2020(UTC), Алексей Черенцов оставлено 22.07.2020(UTC)
Offline Алексей Черенцов  
#3 Оставлено : 20 июля 2020 г. 4:33:49(UTC)
Алексей Черенцов

Статус: Активный участник

Группы: Участники
Зарегистрирован: 30.10.2019(UTC)
Сообщений: 56
Российская Федерация
Откуда: Новосибирск

Сказал(а) «Спасибо»: 14 раз
Автор: Elvira Borodina Перейти к цитате

Функции, указанные вами, не предназначались для такого внешнего использования (они используются в рамках JCP).
Но особенность, обнаруженная вами, интересная.
Не могли бы Вы прислать код полностью, в частности, как Вы создаете объект RutokenStore (этот класс абстрактный, напрямую вызов функций не предусмотрен)?


Здравствуйте! Вот упрощённый пример:
Код:

	public Optional<Certificate> readCert(String alias, String STORE_TYPE, final String STORE_PASSWORD) throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
		final KeyStore keyStore = KeyStore.getInstance(STORE_TYPE);
		keyStore.load(null, STORE_PASSWORD.toCharArray());
		System.out.println("Тут корретно выводятся имена двух рутокенов:");
		for (int i = 0; i < 11; i++)
			if (RutokenStore.getStoreName(i) != null)
				System.out.println("Storage: " + RutokenStore.getStoreName(i) + " SN: " + RutokenStore.getStoreSerial(i));

		final Certificate cert = keyStore.getCertificate(alias);
		System.out.println("Тут все стораджы равняются null:");
		for (int i = 0; i < 11; i++)
			if (RutokenStore.getStoreName(i) != null)
				System.out.println("Storage: " + RutokenStore.getStoreName(i) + " SN: " + RutokenStore.getStoreSerial(i));

		return Optional.of(cert);
	}


Автор: Elvira Borodina Перейти к цитате

Стандартный метод получения имен хранилищ Rutoken - через функцию getServices


Спасибо, попробую
Offline Алексей Черенцов  
#4 Оставлено : 20 июля 2020 г. 9:22:09(UTC)
Алексей Черенцов

Статус: Активный участник

Группы: Участники
Зарегистрирован: 30.10.2019(UTC)
Сообщений: 56
Российская Федерация
Откуда: Новосибирск

Сказал(а) «Спасибо»: 14 раз
А... Вспомнил почему мне общение с Рутокеном через getServices не подошло - я там не нашёл механизма получения серийного номера Рутокена. Потому и стал искать что-то недокументированное. Может быть есть возможность через getServices серийный номер получать? А то если я делаю так:

Код:
        Provider provider = new JCP();
        Set<Provider.Service> services = provider.getServices();
        List<String> listStore = new ArrayList<String>();
        for (Provider.Service service : services) {
            if (service.getType().equalsIgnoreCase("KeyStore") && service.getAlgorithm().startsWith("RutokenStore")) {
                listStore.add(service.getAlgorithm());
            }
        }


то могу взять серийник из getAlgorithm() только когда в машину вставленно более одного Рутокена.
Offline Elvira Borodina  
#5 Оставлено : 20 июля 2020 г. 14:23:31(UTC)
Elvira Borodina

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 24.04.2018(UTC)
Сообщений: 24
Российская Федерация

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 9 раз в 6 постах
Добрый день!
Запустила ваш код, у меня описанная вами проблема не воспроизводится, в лог выводится следующее:
Код:

Тут корретно выводятся имена двух рутокенов:
Storage: RutokenStore_377079EB SN: 377079EB
Storage: RutokenStore_355F7296 SN: 355F7296
Тут все стораджы равняются null:
Storage: RutokenStore_377079EB SN: 377079EB
Storage: RutokenStore_355F7296 SN: 355F7296

Я запускала и для одного токена, и для двух.
В любом случае, данным функциями из класса RutokenStore пользоваться не стоит, они не были изначально для этого предназначены.

Цитата:

..то могу взять серийник из getAlgorithm() только когда в машину вставленно более одного Рутокена.

Да, это действительно так. В настоящий момент получение серийного номера напрямую не предусмотрено.
Мы постараемся в ближайшее время добавить такой функционал. Пришлите ваш E-MAIL, мы пришлем вам версию JCP с этой доработкой.

Отредактировано пользователем 20 июля 2020 г. 14:24:40(UTC)  | Причина: Не указана

thanks 1 пользователь поблагодарил Elvira Borodina за этот пост.
Алексей Черенцов оставлено 24.07.2020(UTC)
Offline Алексей Черенцов  
#6 Оставлено : 21 июля 2020 г. 4:35:29(UTC)
Алексей Черенцов

Статус: Активный участник

Группы: Участники
Зарегистрирован: 30.10.2019(UTC)
Сообщений: 56
Российская Федерация
Откуда: Новосибирск

Сказал(а) «Спасибо»: 14 раз
Спасибо! st_aleks пёс rambler.ru
Offline Алексей Черенцов  
#7 Оставлено : 22 июля 2020 г. 5:37:25(UTC)
Алексей Черенцов

Статус: Активный участник

Группы: Участники
Зарегистрирован: 30.10.2019(UTC)
Сообщений: 56
Российская Федерация
Откуда: Новосибирск

Сказал(а) «Спасибо»: 14 раз
Автор: Elvira Borodina Перейти к цитате
Добрый день!
Запустила ваш код, у меня описанная вами проблема не воспроизводится


Может дело в версии, сейчас использую библиотеки JCP взятые из java-csp-5.0.40621-A. Но вобще я нашёл как победить этот сбой у меня. Если выполнить new RutokenStore001(); то RutokenStore.getStoreName(i) перестаёт быть равным null:

Код:

	public Optional<Certificate> readCert(String alias, String STORE_TYPE, final String STORE_PASSWORD) throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
		final KeyStore keyStore = KeyStore.getInstance(STORE_TYPE);
		keyStore.load(null, STORE_PASSWORD.toCharArray());
		System.out.println("Тут корретно выводятся имена двух рутокенов:");
		for (int i = 0; i < 11; i++)
			if (RutokenStore.getStoreName(i) != null)
				System.out.println("Storage: " + RutokenStore.getStoreName(i) + " SN: " + RutokenStore.getStoreSerial(i));

		final Certificate cert = keyStore.getCertificate(alias);
		System.out.println("Тут все стораджы равняются null. Но мы сделаем new RutokenStore001();");
		try {
		    new RutokenStore001();
		} catch (Exception e) {
		    e.printStackTrace();
        }
		System.out.println("Тут опять корретно выводятся имена двух рутокенов:");
		for (int i = 0; i < 11; i++)
			if (RutokenStore.getStoreName(i) != null)
				System.out.println("Storage: " + RutokenStore.getStoreName(i) + " SN: " + RutokenStore.getStoreSerial(i));

		return Optional.of(cert);
	}


Написал на случай если кто тоже сталкнётся с такой же проблемой.

Отредактировано пользователем 24 июля 2020 г. 5:40:21(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#8 Оставлено : 22 июля 2020 г. 10:42:57(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,921
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 688 раз в 649 постах
Здравствуйте.
Спасибо за информацию, доработки будут сделаны в 2 этапа: сначала предоставить возможность узнать серийный номер токена по хранилищу, затем - улучшения в работе с рутокеном (при этом часть видимых сейчас внутренних методов и классов может стать недоступной).
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Алексей Черенцов оставлено 24.07.2020(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.