Статус: Активный участник
Группы: Участники
Зарегистрирован: 18.11.2016(UTC) Сообщений: 59 Откуда: Москва Сказал(а) «Спасибо»: 6 раз Поблагодарили: 3 раз в 2 постах
|
Программно носитель не видно - в перечислении видны только REGISTRY и FAT12_E. Но если в апплете CryptoPro CSP искать по сертификату, то в поле unique container попадает наименование носителя и путь ключевого контейнера на нем.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,925 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 691 раз в 652 постах
|
Автор: ivanko Программно носитель не видно - в перечислении видны только REGISTRY и FAT12_E. Но если в апплете CryptoPro CSP искать по сертификату, то в поле unique container попадает наименование носителя и путь ключевого контейнера на нем. Вы ведь получили в коде "alias roslov190220287caa8f-a18f-45be-ade0-dde5142aeb78-copy was found in REGISTRY" - значит, контейнер получен програмно. То, что он не найден по сертификату программно, как вы хотите, может быть связано с тем, что в контейнере нет сертификата - вы могли установить сертификат в My и связать с контейнером, потому CSP его может видеть, а JCSP - нет. Потому было предложено проверить в панели JCP - есть ли сертификат в контейнере, но контейнер не виден, возможно, нет прав. Попробуйте найти этот установленный контейнер в реестре и проверить размер его header.key. Еще можно приложить тест контейнера в панели CSP сюда. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 18.11.2016(UTC) Сообщений: 59 Откуда: Москва Сказал(а) «Спасибо»: 6 раз Поблагодарили: 3 раз в 2 постах
|
Ни в реестре, ни в FAT12_E этого контейнера нет, потому что они не выдаются в перечислении. Но выдаются по прямому имени. Как проверить программно есть ли в контейнере сертификат или нет? Код:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\JavaSoft]
[HKEY_CURRENT_USER\Software\JavaSoft\Prefs]
[HKEY_CURRENT_USER\Software\JavaSoft\Prefs\ru]
[HKEY_CURRENT_USER\Software\JavaSoft\Prefs\ru\/Crypto/Pro]
[HKEY_CURRENT_USER\Software\JavaSoft\Prefs\ru\/Crypto/Pro\/J/C/P]
[HKEY_CURRENT_USER\Software\JavaSoft\Prefs\ru\/Crypto/Pro\/J/C/P\/Control/Pane]
"trusts"=""
"/J/C/P/Dialog_parametres_/Input/Password_pos/X"="10"
"/J/C/P/Dialog_parametres_/Input/Password_pos/Y"="10"
Отредактировано пользователем 20 ноября 2020 г. 16:42:16(UTC)
| Причина: Не указана
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,925 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 691 раз в 652 постах
|
alias roslov190220287caa8f-a18f-45be-ade0-dde5142aeb78-copy - это не он? "Ни в реестре, ни в FAT12_E этого контейнера нет, потому что они не выдаются в перечислении. Но выдаются по прямому имени." -фраза непонятна. Если контейнера нет, то он никак не будет выдан. Если он выдается - то он есть, и если это roslov190220287caa8f-a18f-45be-ade0-dde5142aeb78-copy - то, как написано в вашем логе, он в реестре. Программно: Object c = (X509Certificate)store.getCertificate(alias); в вашем коде. Отредактировано пользователем 20 ноября 2020 г. 16:42:33(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,925 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 691 раз в 652 постах
|
Автор: ivanko Код:
Windows Registry Editor Version 5.00
[HKEY_CURRENT_USER\Software\JavaSoft]
[HKEY_CURRENT_USER\Software\JavaSoft\Prefs]
[HKEY_CURRENT_USER\Software\JavaSoft\Prefs\ru]
[HKEY_CURRENT_USER\Software\JavaSoft\Prefs\ru\/Crypto/Pro]
[HKEY_CURRENT_USER\Software\JavaSoft\Prefs\ru\/Crypto/Pro\/J/C/P]
[HKEY_CURRENT_USER\Software\JavaSoft\Prefs\ru\/Crypto/Pro\/J/C/P\/Control/Pane]
"trusts"=""
"/J/C/P/Dialog_parametres_/Input/Password_pos/X"="10"
"/J/C/P/Dialog_parametres_/Input/Password_pos/Y"="10"
Это настройки JCP/JCSP, к месту хранения контейнеров отношения не имеют. |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 18.11.2016(UTC) Сообщений: 59 Откуда: Москва Сказал(а) «Спасибо»: 6 раз Поблагодарили: 3 раз в 2 постах
|
Автор: Евгений Афанасьев alias roslov190220287caa8f-a18f-45be-ade0-dde5142aeb78-copy - это не он?
Это он, но его физически нет ни в реестре, ни на дискете. Он лежит в сервисе кеширования. Автор: Евгений Афанасьев "Ни в реестре, ни в FAT12_E этого контейнера нет, потому что они не выдаются в перечислении. Но выдаются по прямому имени." -фраза непонятна. Если контейнера нет, то он никак не будет выдан. Если он выдается - то он есть, и если это roslov190220287caa8f-a18f-45be-ade0-dde5142aeb78-copy - то, как написано в вашем логе, он в реестре. Программно: Object c = (X509Certificate)store.getCertificate(alias); в вашем коде.
Так, чтобы не было разночтений. Я взял вот такой код
Код:
public static KeyStore checkStore(String store, String alias) throws Exception {
KeyStore ks = KeyStore.getInstance(store);
ks.load(null, null);
log("Store "+store);
X509Certificate x = getCrt();
String A = ks.getCertificateAlias(x);
log("Search result alias by crt " + x.getSerialNumber().toString(16) + " : " + A);
X509Certificate c = (X509Certificate)ks.getCertificate(alias);
if( null != c ){
log("Alias "+alias+" was found in "+ store + " with crt " + c.getSerialNumber().toString(16));
}else{
log("Alias "+alias+" was not found in " + store);
}
Enumeration<String> enumeration = ks.aliases();
while (enumeration.hasMoreElements()) {
String alias1 = enumeration.nextElement();
log("Alias: " + alias1);
}
return ks;
}
public static KeyStore getKS(String alias) throws Exception {
KeyStore ks = null;
for (Object storeT : KeyStoreConfig.getInstance().getNames()) {
ks = checkStore(String.valueOf(storeT), alias);
}
if(null == ks){
throw new Exception("no store found for " + alias);
}
return ks;
}
Что в нем происходит - перечисляем хранилища, в каждом делаем так - сначала пытаемся получить имя контейнера по сертификату. Потом явно ищем имя контейнера. Потом перечисляем контейнеры в хранилище. Результат
Код:
Store REGISTRY
Crt loaded CN=Рослов Александр Владимирович, EMAILADDRESS=roslov@rosenergo.com, OID.1.2.840.113549.1.9.2=NPADMNTS
Search result alias by crt 5fa3e928000200000892 : null
Alias roslov190220287caa8f-a18f-45be-ade0-dde5142aeb78-copy was found in REGISTRY with crt 5fa3e928000200000892
Store FAT12_E
Crt loaded CN=Рослов Александр Владимирович, EMAILADDRESS=roslov@rosenergo.com, OID.1.2.840.113549.1.9.2=NPADMNTS
Search result alias by crt 5fa3e928000200000892 : null
Alias roslov190220287caa8f-a18f-45be-ade0-dde5142aeb78-copy was found in FAT12_E with crt 5fa3e928000200000892
Alias: le-4a602b0a-f3da-411e-a6ee-79dde50f0907
Alias: le-e3a4030c-d46f-4cf1-8c57-c205544da382
Alias: te-f8d70535-ee62-4ac4-8b27-ceae5153db56
Alias: soi2_kovalenko_ig_ats
Alias: testovich_1_12_2022
Alias: soi2_ivan4
Выходит, что нужный (кэшированный) контейнер в обоих хранилищах, но в перечислении не выводится. То есть обращения к штатным хранилищам перехватывает служба кеширования, которая на прямой запрос может отдать кешированный контейнер, а операции перечисления и поиска по сертификату пропускает прямо в хранилище, никак не модифицируя ответ. И сразу ответ про сертификат в контейнере - очевидно, он там есть, раз в прямом доступе возвращается сертификат, связанный с ключом, а не null. Вопрос - как можно обратиться к хранилищу службы кеширования? учитывая, что носитель с которого кешировали ключевой контейнер в системе не присутствует.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,925 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 691 раз в 652 постах
|
То ест проблема в том, что при перечислении контейнер не виден, только при явном обращении к нему по имени? Отредактировано пользователем 21 ноября 2020 г. 10:48:25(UTC)
| Причина: Не указана |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 18.11.2016(UTC) Сообщений: 59 Откуда: Москва Сказал(а) «Спасибо»: 6 раз Поблагодарили: 3 раз в 2 постах
|
Да, именно в этом проблема. Имена контейнеров - это слишком низкий уровень абстракции для нашего процесса и хочется как в Delphi получать контейнер по сертификату.
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,925 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 691 раз в 652 постах
|
Если контейнер не виден при перечислении, то getCertificateAlias(cert) не сработает, потому что он как раз работает через перечисление: перечисляет все алиасы, получает у них сертификаты и сравнивает с cert. Подумаем, что можно сделать. |
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 06.12.2008(UTC) Сообщений: 3,925 Откуда: Крипто-Про Сказал(а) «Спасибо»: 20 раз Поблагодарили: 691 раз в 652 постах
|
Мне подсказали, что получить доступ к закешированному контейнеру можно только по имени (алиасу): "Правильный путь - открыть сертификат в хранилище, прочитать ссылку на ключ и открыть контейнер.", но пока этот такой способ в JCSP не поддерживается. |
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close