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

Уведомление

Icon
Error

3 Страницы123>
Опции
К последнему сообщению К первому непрочитанному
Offline Andrey Zhilov  
#1 Оставлено : 9 июня 2020 г. 10:33:34(UTC)
Andrey Zhilov

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

Группы: Участники
Зарегистрирован: 09.06.2020(UTC)
Сообщений: 18
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 4 раз
Здравствуйте, стоит следующая задача: подписывать возвращаемые данные сервисом. Сервис реализован на Java.
Для реализации данной задачи использовал wincrypt api, для теста написал следующий код:

Код:

    Advapi32.INSTANCE.CryptAcquireContext(hProv, "\\\\.\\FAT12_D\\NEdoma 2020", null, Advapi32.PROV_GOST_2012_256, 0);
    Advapi32.INSTANCE.CryptCreateHash(hProv.getValue(), Advapi32.CALG_GR3411_2012_256, 0, 0, hHash);
    Advapi32.INSTANCE.CryptHashData(hHash.getValue(), data, data.length(), 0);
    Advapi32.INSTANCE.CryptSignHash(hHash.getValue(), Advapi32.AT_SIGNATURE, null, 0, sign, 256);


Функция CryptSignHash возвращает ошибку "Набор ключей не существует".
Пробывал уже создавать контейнер и на съёмном носителе (флэшке) и в реестре. Разницы никакой.
При тестировании контейнера средствами КриптоПро CSP выдаётся отчёт:

Цитата:

Проверка завершена успешно ошибок не обнаружено
Контейнер закрытого ключа пользователя
имя NEdoma 2020
уникальное имя FAT12\B013797D\\2B5E
FQCN \\.\FAT12_D\NEdoma 2020
проверка целостности контейнера успешно
Ключ обмена доступен
длина ключа 512 бит
экспорт открытого ключа успешно
вычисление открытого ключа успешно
импорт открытого ключа успешно
подпись успешно
проверка успешно
создание ключа обмена успешно
экспорт ключа разрешен
алгоритм ГОСТ Р 34.10-2012 DH 256 бит
ГОСТ Р 34.10 256 бит, параметры обмена по умолчанию
ГОСТ Р 34.11-2012 256 бит
ГОСТ 28147-89, параметры шифрования ТК26 Z
сертификат в контейнере соответствует закрытому ключу
сертификат в хранилище My
E=citto@72to.ru, ИНН=007202190205, ОГРН=1087232038794, STREET="ул.Советская, 61", C=RU, S=72 Тюменская область, L=Тюмень, O="ГКУ ТО ""ЦИТТО""", CN=https://nedoma.72to.ru
FAT12\B013797D\\2B5E; Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider#80; dwFlags: 0x00000000; dwKeySpec: AT_KEYEXCHANGE#1
addressbook
E=citto@72to.ru, ИНН=007202190205, ОГРН=1087232038794, STREET="ул.Советская, 61", C=RU, S=72 Тюменская область, L=Тюмень, O="ГКУ ТО ""ЦИТТО""", CN=https://nedoma.72to.ru
не содержит ссылку на закрытый ключ
имя сертификата https://nedoma.72to.ru
субъект E=citto@72to.ru, ИНН=007202190205, ОГРН=1087232038794, STREET="ул.Советская, 61", C=RU, S=72 Тюменская область, L=Тюмень, O="ГКУ ТО ""ЦИТТО""", CN=https://nedoma.72to.ru
поставщик ОГРН=1087232038794, ИНН=007202190205, C=RU, S=72 Тюменская область, L=Тюмень, STREET="ул.Советская, д.61", O="ГКУ ТО ""ЦИТТО""", CN="ГКУ ТО ""ЦИТТО"""
действителен с 21 апреля 2020 г. 11:30:43
действителен по 21 июля 2021 г. 11:30:43
серийный номер 040F 6E00 A4AB FEAB 4046 5FBB 53C2 B87B
лицензия 406 дней
Срок действия закрытого ключа 21 июля 2021 г. 11:30:43
Использование ключа обмена разрешено до окончания срока действия закрытого ключа.
Ключ подписи отсутствует
загрузка ключей успешно
Версия контейнера 2
Расширения контейнера
некритическое Расширение контейнера КриптоПро CSP. Срок действия ключа обмена
действителен по 21 июля 2021 г. 11:40:42
некритическое Расширение контейнера КриптоПро CSP. Промежуточные сертификаты
имя сертификата ГКУ ТО "ЦИТТО"
субъект ОГРН=1087232038794, ИНН=007202190205, C=RU, S=72 Тюменская область, L=Тюмень, STREET="ул.Советская, д.61", O="ГКУ ТО ""ЦИТТО""", CN="ГКУ ТО ""ЦИТТО"""
поставщик E=dit@minsvyaz.ru, C=RU, S=77 Москва, L=г. Москва, STREET="улица Тверская, дом 7", O=Минкомсвязь России, ОГРН=1047702026701, ИНН=007710474375, CN=Минкомсвязь России
действителен с 11 декабря 2018 г. 13:15:35
действителен по 11 декабря 2033 г. 13:15:35
серийный номер 00AC 0902 1600 0000 0001 8B
некритическое Расширение контейнера КриптоПро CSP. Доверенные сертификаты обмена
имя сертификата Минкомсвязь России
субъект E=dit@minsvyaz.ru, C=RU, S=77 Москва, L=г. Москва, STREET="улица Тверская, дом 7", O=Минкомсвязь России, ОГРН=1047702026701, ИНН=007710474375, CN=Минкомсвязь России
поставщик E=dit@minsvyaz.ru, C=RU, S=77 Москва, L=г. Москва, STREET="улица Тверская, дом 7", O=Минкомсвязь России, ОГРН=1047702026701, ИНН=007710474375, CN=Минкомсвязь России
действителен с 6 июля 2018 г. 17:18:06
действителен по 1 июля 2036 г. 17:18:06
серийный номер 4E6D 478B 26F2 7D65 7F76 8E02 5CE3 D393



Меня смущает данная фраза "не содержит ссылку на закрытый ключ". Это нормально? Пробывал сбрачывать сохранённые пароли, как пишут на форуме, перезагружать компьютер, пересоздавать контейнер. Результат тот же.
Offline Андрей *  
#2 Оставлено : 9 июня 2020 г. 10:52:34(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,683
Мужчина
Российская Федерация

Сказал «Спасибо»: 572 раз
Поблагодарили: 2302 раз в 1803 постах
Здравствуйте.

1. AT_SIGNATURE почему? Если тест контейнера показывает, что ключа подписи нет
2. Насчёт ссылки - посмотрите внимально, к какому хранилищу относится эта информация (my\address)
3. CryptAcquireContext - почему не указан CSP?
4. Почему имя контейнера "\\\\.\\FAT12_D\\NEdoma 2020", а не такое, как в тесте?
Техническую поддержку оказываем тут
Наша база знаний
Offline Andrey Zhilov  
#3 Оставлено : 9 июня 2020 г. 13:49:27(UTC)
Andrey Zhilov

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

Группы: Участники
Зарегистрирован: 09.06.2020(UTC)
Сообщений: 18
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 4 раз
Спасибо за ответ. Я не пишу на java и до этого не имел опыта подписания с использованием КриптоПро CSP, но так сложились обстоятельства, что приходится вникать =)
1. Ну собственно я ориентировался на примеры из msdn и sdk (SigningHash.c). В них используется данный флаг, указывающий на использование ключей для подписи, на сколько я понимаю.
2. Не совсем понял, что надо сделать и как это сделать. В отчёте написано
Цитата:
сертификат в хранилище My
. Вы про это?
3. Что вы имеете ввиду под CSP? Параметр pszContainer? Если да, то пробывал указывать. Конвертировал имя контейнера из типа String java в null-terminated string, согласно описания на msdn таким образом:
Код:

    String containerName = config().getString("csp.container");
    byte[] stringBytes = containerName.getBytes();
    byte[] ntContainerName = new byte[stringBytes.length + 1];
    System.arraycopy(stringBytes, 0, ntContainerName , 0, stringBytes.length);


В результате при запуске выводится следующее окно:
dialog.png (10kb) загружен 6 раз(а).
4. Опять же ориентировался на код примера там определяют следующую константу:
Код:

    #define CONTAINER _TEXT("\\\\.\\HDIMAGE\\test")

Пробывал использовать все (NEdoma 2020, FAT12\B013797D\NEdomag2.000\2B5E, \\.\FAT12_D\NEdoma 2020) из отчёта теста. Результат один и тот же.

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

Offline Андрей *  
#4 Оставлено : 9 июня 2020 г. 13:54:53(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,683
Мужчина
Российская Федерация

Сказал «Спасибо»: 572 раз
Поблагодарили: 2302 раз в 1803 постах
Нет проблем с My, не нужно смотреть в addressbook:

Цитата:
сертификат в контейнере соответствует закрытому ключу
сертификат в хранилище My
E=citto@72to.ru, ИНН=007202190205, ОГРН=1087232038794, STREET="ул.Советская, 61", C=RU, S=72 Тюменская область, L=Тюмень, O="ГКУ ТО ""ЦИТТО""", CN=https://nedoma.72to.ru
FAT12\B013797D\\2B5E; Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider#80; dwFlags: 0x00000000; dwKeySpec: AT_KEYEXCHANGE#1


addressbook
E=citto@72to.ru, ИНН=007202190205, ОГРН=1087232038794, STREET="ул.Советская, 61", C=RU, S=72 Тюменская область, L=Тюмень, O="ГКУ ТО ""ЦИТТО""", CN=https://nedoma.72to.ru
не содержит ссылку на закрытый ключ


dwKeySpec: AT_KEYEXCHANGE - тип ключа, вместо AT_SIGNATURE

Насчёт снимка - там ???? в имени выставлены...
Техническую поддержку оказываем тут
Наша база знаний
Offline Андрей *  
#5 Оставлено : 9 июня 2020 г. 13:59:00(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,683
Мужчина
Российская Федерация

Сказал «Спасибо»: 572 раз
Поблагодарили: 2302 раз в 1803 постах
Автор: Andrey Zhilov Перейти к цитате
согласно описания на msdn таким образом:
Код:

    String containerName = config().getString("csp.container");
    byte[] stringBytes = [h]str[/h].getBytes();
    byte[] ntContainerName = new byte[stringBytes.length + 1];
    System.arraycopy(stringBytes, 0, ntContainerName , 0, stringBytes.length);



str - ?
containerName - как участвует после чтения из config?
Техническую поддержку оказываем тут
Наша база знаний
Offline Andrey Zhilov  
#6 Оставлено : 9 июня 2020 г. 14:12:20(UTC)
Andrey Zhilov

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

Группы: Участники
Зарегистрирован: 09.06.2020(UTC)
Сообщений: 18
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 4 раз
Цитата:

str - ?
containerName - как участвует после чтения из config?

поправил там должен быть containerName, но уже было поздно =)

Цитата:

Насчёт снимка - там ???? в имени выставлены...

Возможно я неверно конвертирую тип String в LPSTR. Сейчас ещё почитаю про данный тип. Вероятнее проблема в этом.


Цитата:

dwKeySpec: AT_KEYEXCHANGE - тип ключа, вместо AT_SIGNATURE

Да, это моя невнимательность, спасибо.
Offline Andrey Zhilov  
#7 Оставлено : 9 июня 2020 г. 16:18:05(UTC)
Andrey Zhilov

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

Группы: Участники
Зарегистрирован: 09.06.2020(UTC)
Сообщений: 18
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 4 раз
Исправил все неточности. Теперь код выглядит так:

Код:

IntByReference hProv = new IntByReference(0);
IntByReference hHash = new IntByReference(0);
String containerName = config().getString("csp.container.name");
String containerPassword = config().getString("csp.container.password");
LPWSTR ntContainerName = new LPWSTR(containerName);
String data = "dhflajkdfhalkdfahdljfahdflajkdsf";
ByteByReference sign = new ByteByReference();

Advapi32.INSTANCE.CryptAcquireContext(hProv, ntContainerName, null, Advapi32.PROV_GOST_2012_256, 0);
Advapi32.INSTANCE.CryptSetProvParam(hProv.getValue(), Advapi32.PP_KEYEXCHANGE_PIN, containerPassword.getBytes(), 0);
Advapi32.INSTANCE.CryptCreateHash(hProv.getValue(), Advapi32.CALG_GR3411_2012_256, 0, 0, hHash);
Advapi32.INSTANCE.CryptHashData(hHash.getValue(), data, data.length(), 0);
Advapi32.INSTANCE.CryptSignHash(hHash.getValue(), Advapi32.AT_KEYEXCHANGE, null, 0, sign, 1000);
Advapi32.INSTANCE.CryptSetProvParam(hProv.getValue(), Advapi32.PP_USE_HARDWARE_RNG, null, 0);


Вывод результатов выполнения выглядит так:
Код:

Container name: FAT12\B013797D\NEdomag2.000\2B5E
CryptAcquireContext: Операция успешно завершена.
CryptSetProvParam (PP_KEYEXCHANGE_PIN): Операция успешно завершена.
CryptCreateHash: Операция успешно завершена.
CryptHashData: Операция успешно завершена.
CryptSignHash: Ключ не существует.
CryptSetProvParam (PP_USE_HARDWARE_RNG): Библиотека поставщика проинициализирована неправильно.


Странно, конечно, что он постоянно выводит диалоговое окно ввода пароля к контейнеру (вроде бы задал параметр PP_KEYEXCHANGE_PIN), но это ладно.
Но не могу понять почему попрежнему при попытке подписи "Ключ не существует.". Хотя контейнер присутствует с ключами. И ссылка на него есть.
Можете помочь разобраться? В каких случаях возможно данное поведение?
Offline KDA  
#8 Оставлено : 10 июня 2020 г. 14:53:27(UTC)
KDA

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

Группы: Участники
Зарегистрирован: 12.10.2009(UTC)
Сообщений: 42

Сказал(а) «Спасибо»: 4 раз
Поблагодарили: 6 раз в 6 постах
Скорее всего, проблемы все-таки с паролем.
В Crypto API параметр PP_KEYEXCHANGE_PIN предполагает на входе строку в ANSI кодировке с нулем на конце.
Т.е. для пароля "123" нужно 4 байта: 0x31, 0x32, 0x33, 0x0
thanks 1 пользователь поблагодарил KDA за этот пост.
Andrey Zhilov оставлено 11.06.2020(UTC)
Offline Andrey Zhilov  
#9 Оставлено : 10 июня 2020 г. 23:01:52(UTC)
Andrey Zhilov

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

Группы: Участники
Зарегистрирован: 09.06.2020(UTC)
Сообщений: 18
Российская Федерация
Откуда: Тюмень

Сказал(а) «Спасибо»: 4 раз
Спасибо за наводку. С паролем проблема ушла, но осталась всё та же проблема при подписи (вызове CryptSignHash) возникает ошибка "Ключ не существует".
Код выглядит следующим образом:
Код:

IntByReference hProv = new IntByReference(0);
IntByReference hHash = new IntByReference(0);

String data = "dhflajkdfhalkdfahdljfahdflajkdsf";

String containerName = config().getString("csp.container.name");
LPWSTR ntContainerName = new LPWSTR(containerName);

String containerPassword = config().getString("csp.container.password");
byte[] ntContainerPassword = new byte[containerPassword.length() + 1];
byte[] password = containerPassword.getBytes(StandardCharsets.US_ASCII);
System.arraycopy(password, 0, ntContainerPassword, 0, containerPassword.length());

Advapi32.INSTANCE.CryptAcquireContext(hProv, ntContainerName, null, Advapi32.PROV_GOST_2012_256, 0);
Advapi32.INSTANCE.CryptSetProvParam(hProv.getValue(), Advapi32.PP_KEYEXCHANGE_PIN, ntContainerPassword, 0);
Advapi32.INSTANCE.CryptCreateHash(hProv.getValue(), Advapi32.CALG_GR3411_2012_256, 0, 0, hHash);
Advapi32.INSTANCE.CryptHashData(hHash.getValue(), data, data.length(), 0);
Advapi32.INSTANCE.CryptSignHash(hHash.getValue(), Advapi32.AT_KEYEXCHANGE, null, 0, sign, 1000);


Вывод результатов выполнения выглядит так:
Код:

Container name: FAT12\B013797D\NEdomag2.000\2B5E
CryptAcquireContext: Операция успешно завершена.
CryptSetProvParam (PP_KEYEXCHANGE_PIN): Операция успешно завершена.
CryptCreateHash: Операция успешно завершена.
CryptHashData: Операция успешно завершена.
CryptSignHash: Ключ не существует.


Носитель на месте, файлы на нём присутствуют, контейнер создан (и пересоздан несколько раз), пароли сохранённые почищены. При просмотре сертификата есть надпись, что ссылка на закрытый ключ присутсвует. Его я несколько раз уже переустановил.
Offline Андрей *  
#10 Оставлено : 10 июня 2020 г. 23:13:30(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,683
Мужчина
Российская Федерация

Сказал «Спасибо»: 572 раз
Поблагодарили: 2302 раз в 1803 постах
в CryptAcquireContext "Crypto-Pro GOST R 34.10-2012 Cryptographic Service Provider" почему не указывается?
Техническую поддержку оказываем тут
Наша база знаний
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
3 Страницы123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.