Статус: Участник
Группы: Участники
Зарегистрирован: 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 - может пропасть прямо во время подписывания). Вопрос: можно ли как-то копировать сертификаты (или контейнеры целиком) из внешних хранилищ непосредствено в приложение (провайдер встроен), и потом уже читать эту коллекцию, дабы все стабильно виделось?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
Здравствуйте. 1. "постоянно перестают видится (особенно NFC - может пропасть прямо во время подписывания)" - это странно. SDK в приложении последний с сайта? Панель управления рутокена из маркета тоже? Проблема только с NFC? Пробовали с другим устройством? 2. "можно ли как-то копировать сертификаты (или контейнеры целиком) из внешних хранилищ непосредствено в приложение (провайдер встроен), и потом уже читать эту коллекцию, дабы все стабильно виделось?" - прочитать ключ и сертификат(ы) с помощью одного KeyStore (получить с помощью getEntry), например, "Aktiv Rutoken ECP 1", и передать в другой KeyStore, например, "HDIMAGE" (записать с помощью setEntry). Отредактировано пользователем 14 сентября 2021 г. 23:31:50(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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й раз.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
На nfc ключи неизвлекаемые, скопировать нельзя. |
|
1 пользователь поблагодарил Евгений Афанасьев за этот пост.
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,963 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 704 раз в 665 постах
|
"подключены одновременно USB и NFC при этом USB считывается корректно, а NFC нет" - возможно, проблема в большом числе одновременно подключенных токенов, т.к. слотов, насколько известно, выделено 2 (два токена за раз: нумерация у имен хранилищ XXX 1 и YYY 2). Попробуйте не подключать сразу 3 устройства, а 1 или 2. Посмотрите также https://dev.rutoken.ru/p...e.action?pageId=81527082 пункт "Решение проблемы с обнаружением Рутокена". |
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 25.04.2022(UTC) Сообщений: 1 Откуда: Москва
|
Автор: Григорий812 Автор: Евгений Афанасьев На nfc ключи неизвлекаемые, скопировать нельзя. Спасибо за ответ. Жаль конечно. Может быть подскажите в чем может быть причина проблемы. При сканировании хранилищ далеко не всегда получаею доступные сертификаты. Как правило первый запуск нормален, но после того как была осуществлена подпись, и хранилища обходятся повторно сертификатов уже не видно. Возможно даже ситуация когда подключены одновременно USB и NFC при этом USB считывается корректно, а NFC нет (Панель управления Рутокен наличие NFC показывает). Столкнулись с той же проблемой. Как она у вас решилась, не подскажете? Отредактировано пользователем 25 апреля 2022 г. 17:51:59(UTC)
| Причина: Не указана
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close