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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Григорий812  
#1 Оставлено : 14 сентября 2021 г. 17:43:23(UTC)
Григорий812

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Здравствуйте.

Столкнулся со следующей проблемой.
Задача состоит в подписи файлов с помощью рутокенов (имеющихся на различных носителях) на смартфоне.
Однако при попытке использования сертификатов напрямую из хранилищ:

Код:

"Aktiv Rutoken ECP NFC 2",
"Aktiv Rutoken ECP NFC 1",
"Aktiv Rutoken ECP BT 1",
"Aktiv Rutoken ECP BT 2",
"Aktiv Rutoken ECP 2",
"Aktiv Rutoken ECP 1"


они постоянно перестают видится (особенно NFC - может пропасть прямо во время подписывания).

Вопрос: можно ли как-то копировать сертификаты (или контейнеры целиком) из внешних хранилищ непосредствено в приложение (провайдер встроен), и потом уже читать эту коллекцию, дабы все стабильно виделось?

Offline Евгений Афанасьев  
#2 Оставлено : 14 сентября 2021 г. 23:31:16(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
Здравствуйте.
1. "постоянно перестают видится (особенно NFC - может пропасть прямо во время подписывания)" - это странно.
SDK в приложении последний с сайта?
Панель управления рутокена из маркета тоже?
Проблема только с NFC? Пробовали с другим устройством?
2. "можно ли как-то копировать сертификаты (или контейнеры целиком) из внешних хранилищ непосредствено в приложение (провайдер встроен), и потом уже читать эту коллекцию, дабы все стабильно виделось?" - прочитать ключ и сертификат(ы) с помощью одного KeyStore (получить с помощью getEntry), например, "Aktiv Rutoken ECP 1", и передать в другой KeyStore, например, "HDIMAGE" (записать с помощью setEntry).

Отредактировано пользователем 14 сентября 2021 г. 23:31:50(UTC)  | Причина: Не указана

Offline Григорий812  
#3 Оставлено : 15 сентября 2021 г. 10:39:06(UTC)
Григорий812

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Автор: Евгений Афанасьев Перейти к цитате

SDK в приложении последний с сайта?


приложение собрано на основе библиотек из пакета 5.0.42506.

Автор: Евгений Афанасьев Перейти к цитате

Панель управления рутокена из маркета тоже?


да.

Автор: Евгений Афанасьев Перейти к цитате

Проблема только с NFC? Пробовали с другим устройством?


Да, получаю сертификаты через:
Код:


KeyStore keyStore = KeyStore.getInstance(USE_STORE[i], JCSP.PROVIDER_NAME);
keyStore.load(null, null);

     for (Enumeration<String> aliases = keyStore.aliases(); aliases.hasMoreElements(); ) {
                        String alias = aliases.nextElement();

                        Certificate certificate     = keyStore.getCertificate(alias);
                        String certificateType      = certificate.getType() ;

... ... ...

                    }


Но в результате далеко невсегда получаю актуальный список сертификатов.
NFC зачастую не видится вовсе (или может быть физически убран в момент подписи), а у USB при видимости носителя НЕ видится сертификат - даже сама "Панель Управления" показывает пустой контейнер примерно каждый 3й раз.
Offline Григорий812  
#4 Оставлено : 15 сентября 2021 г. 14:39:32(UTC)
Григорий812

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Хм, странно : при попытке сохранить с NFC карты в HDIMAGE получаю ошибку
"Key is not exportable"

пробовал так:

Код:
   
                        try {
                            if(USE_STORE[i].equals("Aktiv Rutoken ECP NFC 1") || USE_STORE[i].equals("Aktiv Rutoken ECP NFC 2")  ){
                                String pass = "12345678";
                                char[] passChar = pass.toCharArray();
                                KeyStore.ProtectionParameter protParam  = new KeyStore.PasswordProtection(passChar)  ;
                                KeyStore.Entry entry                    =  keyStore.getEntry(alias,protParam);
                                keyStoreHDIMAGE.setEntry("test",entry,  protParam);
                            }
                        }catch (Exception e){
                            result += e.getMessage();                          
                        }




Код:
            try {
                            KeyStore.ProtectionParameter protParam  = new KeyStore.PasswordProtection(null)  ;
                            KeyStore.Entry entry                    =  keyStore.getEntry(alias,protParam);
                            keyStoreHDIMAGE.setEntry("test1",entry,  protParam);

                        }catch (Exception e){
                            result += e.getMessage();                          
                        }






Код:
             try {
                            String pass = "12345678";
                            char[] passChar = pass.toCharArray();
                            JCPProtectionParameter parameter = new JCPProtectionParameter(passChar);
                            JCPPrivateKeyEntry entry = (JCPPrivateKeyEntry) keyStore.getEntry(alias, parameter );

                            PrivateKey privateKey = entry.getPrivateKey();
                            Certificate[] chain = entry.getCertificateChain();

                            keyStoreHDIMAGE.setKeyEntry("test3", privateKey,  passChar,chain);

                                      

                        }catch (Exception e){
                            result += e.getMessage();                          
                        }

Отредактировано пользователем 15 сентября 2021 г. 14:40:47(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#5 Оставлено : 16 сентября 2021 г. 18:02:09(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
На nfc ключи неизвлекаемые, скопировать нельзя.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
Григорий812 оставлено 17.09.2021(UTC)
Offline Григорий812  
#6 Оставлено : 17 сентября 2021 г. 12:01:32(UTC)
Григорий812

Статус: Участник

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

Сказал(а) «Спасибо»: 1 раз
Автор: Евгений Афанасьев Перейти к цитате
На nfc ключи неизвлекаемые, скопировать нельзя.


Спасибо за ответ. Жаль конечно.

Может быть подскажите в чем может быть причина проблемы.
При сканировании хранилищ далеко не всегда получаею доступные сертификаты.
Как правило первый запуск нормален, но после того как была осуществлена подпись, и хранилища обходятся повторно сертификатов уже не видно.
Возможно даже ситуация когда подключены одновременно USB и NFC при этом USB считывается корректно, а NFC нет (Панель управления Рутокен наличие NFC показывает).


ОБХОД ХРАНИЛИЩ (задействованы все типы useNFC, useBTБ useUSB)
Код:
   
    //получение доступных Rutoken
    public ArrayList<UseRutoken> getUseRutokenList(){
        ArrayList<UseRutoken> result = new ArrayList<UseRutoken>();

        try {

            ArrayList<String> useKeyStoreTypes = new ArrayList<String>();

            if(useNFC){
                for (int i = 0; i < KEY_STORE_ALIASES_NFC.length; i++) {
                    useKeyStoreTypes.add( KEY_STORE_ALIASES_NFC[i]);
                }
            }
            if(useBT){
                for (int i = 0; i < KEY_STORE_ALIASES_BT.length; i++) {
                    useKeyStoreTypes.add( KEY_STORE_ALIASES_BT[i]);
                }
            }
            if(useUSB){
                for (int i = 0; i < KEY_STORE_ALIASES_USB.length; i++) {
                    useKeyStoreTypes.add( KEY_STORE_ALIASES_USB[i]);
                }
            }

//            //получение ВСЕХ хранилищ
//            JCSP prov = new JCSP();
//            Set<Provider.Service> set =  prov.getServices();
//            for (Provider.Service s : set) {
//                   if(s.getType().equals("KeyStore")){
//                   useStoreTypes.add( Ks.getAlgorithm() );
//                }
//            }

            //обход хранилищ
            for (String keyStoreType : useKeyStoreTypes) {

                try {

                    KeyStore keyStore = KeyStore.getInstance(keyStoreType, JCSP.PROVIDER_NAME);
                    keyStore.load(null, null);

                    //обьектов внутри
                    //int keyStoreSize = keyStore.size();

                    //перебор содержимого
                    for (Enumeration<String> aliases = keyStore.aliases(); aliases.hasMoreElements(); ) {
                        String alias = aliases.nextElement();
                        
                        try {
                            //тип содержимого
                            //boolean isKeyEntry = keyStore.isKeyEntry(alias);
                            boolean isCertEntry = keyStore.isCertificateEntry(alias);

                            if(isCertEntry){

                                X509Certificate certificate = (X509Certificate) keyStore.getCertificate(alias);

                                UseRutoken useCertificate = new UseRutoken(keyStoreType, alias, certificate);
                                result.add(useCertificate);
                            }
                        }catch (Exception e){}
                        
                    }

                } catch (Exception e) {}
            }

        }catch (Exception e){}

        return  result;
    }



Код:

    //класс для Rutoken
    public static class UseRutoken {
        public static String PHONE      = "PHONE";
        public static String NFC        = "NFC";
        public static String BT         = "Bluetooth";
        public static String USB        = "USB";
        public static String NON        = "Not identified";


        public String keyStoreType;
        public String alias;
        public X509Certificate certificate;

        protected UseRutoken(String _keyStoreType, String _alias, X509Certificate _certificate) {
            keyStoreType = _keyStoreType;
            alias = _alias;
            certificate = _certificate;
        }

        public String getKeyStoreType(){
            return keyStoreType;
        }
        public String getAlias(){
            return alias;
        }
        public X509Certificate getCertificate(){
            return certificate;
        }

        public String getKeyStoreTypeName(){
            if(keyStoreType == KEY_STORE_ALIASES_HDIMAGE){
                return PHONE;
            }
            if(existInArray(keyStoreType, KEY_STORE_ALIASES_NFC)){
                return NFC;
            }
            if(existInArray(keyStoreType, KEY_STORE_ALIASES_BT)){
                return BT;
            }
            if(existInArray(keyStoreType, KEY_STORE_ALIASES_USB)){
                return USB;
            }

            return NON;
        }

        private boolean existInArray(String _value, String[] _array) {
            for (String item : _array) {
                if (item.equals(_value)) {
                    return true;
//TODO добавить ограничения
                }
            }
            return false;
        }
    }



Код:

    public static String[]KEY_STORE_ALIASES_NFC         = new String []{"Aktiv Rutoken ECP NFC 2","Aktiv Rutoken ECP NFC 1",};
    public static String[]KEY_STORE_ALIASES_BT          = new String []{"Aktiv Rutoken ECP BT 1","Aktiv Rutoken ECP BT 2",};
    public static String[]KEY_STORE_ALIASES_USB         = new String []{"Aktiv Rutoken ECP 2","Aktiv Rutoken ECP 1"};


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

Отредактировано пользователем 17 сентября 2021 г. 15:03:19(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#7 Оставлено : 25 сентября 2021 г. 14:58:03(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 590 раз в 560 постах
"подключены одновременно USB и NFC при этом USB считывается корректно, а NFC нет" - возможно, проблема в большом числе одновременно подключенных токенов, т.к. слотов, насколько известно, выделено 2 (два токена за раз: нумерация у имен хранилищ XXX 1 и YYY 2). Попробуйте не подключать сразу 3 устройства, а 1 или 2.
Посмотрите также https://dev.rutoken.ru/p...e.action?pageId=81527082 пункт "Решение проблемы с обнаружением Рутокена".
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.