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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Роман кислухин  
#1 Оставлено : 29 марта 2011 г. 1:32:33(UTC)
Роман кислухин

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

Группы: Участники
Зарегистрирован: 29.03.2011(UTC)
Сообщений: 170
Мужчина
Откуда: Москва

Сказал «Спасибо»: 8 раз
Поблагодарили: 3 раз в 3 постах
Добрый день

Установил Крипто-Про 3.6 на линуксе. Установил сертификат и ключ в контейнер на жестком диске. csptestf удалось подписать файл, однако с помощью функции CryptSignHashA() этого сделать не получается - функция попросту возвращает FALSE и код ошибки содержит 0. То же самое происходит при использовании функции CryptVerifySignatureA. При этом хэш нормально вычисляется функцией CryptSignHashA - значит с провайдером код работает. Этот же самый код на Windows работает замечательно. Что здесь может быть не так? И почему, если подпись или проверку подписи осуществить не удалось, код ошибки равен 0?
Offline cross  
#2 Оставлено : 29 марта 2011 г. 18:44:51(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
Можно увидеть полный код примера который не работает? + полный вывод консоли от создания подписи.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline Роман кислухин  
#3 Оставлено : 29 марта 2011 г. 20:26:11(UTC)
Роман кислухин

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

Группы: Участники
Зарегистрирован: 29.03.2011(UTC)
Сообщений: 170
Мужчина
Откуда: Москва

Сказал «Спасибо»: 8 раз
Поблагодарили: 3 раз в 3 постах
Кода очень много, запостить целиком пока не могу.
Вот пример:
Код:

-- class GostR3410_2001
  private byte[] signHash(byte[] hash, int hCryptProv, final int hCryptKey)
      throws SignatureException {
    // Acquire a hash object handle.
    final int hashHandle = Advapi.cryptCreateHash(hCryptProv, digestAlgId);
    if (hashHandle == 0)
      throw new SignatureException("Error acquiring digest handle. Error code: " + Win32Api.getLastError());

    try {
      // Set hash value in the hash object
      if (!Advapi.cryptSetHashParam(hashHandle, HP_HASHVAL, hash, 0))
        throw new SignatureException("Error initializing hash value. Error code: " + Win32Api.getLastError());

      // Determine key spec.
      int dwKeySpec = AT_SIGNATURE;

      final int dwAlgId = Win32Api.byteArrayToInt(Advapi.cryptGetKeyParam(hCryptKey, KP_ALGID));
      if (dwAlgId == 0)
        throw new SignatureException("Error getting key algorithm spec. Error code: " + Win32Api.getLastError());

      if ((ALG_CLASS_KEY_EXCHANGE & dwAlgId) == ALG_CLASS_KEY_EXCHANGE) {
        dwKeySpec = AT_KEYEXCHANGE;
      }
      return Advapi.cryptSignHash(hashHandle, dwKeySpec, 0);
    } finally {
      Advapi.cryptDestroyHash(hashHandle);
    }
  }
-- end of class GostR3410_2001

--class Advapi
  public static byte[] cryptSignHash(int hashHandle, int keySpec, int flags) {
    final IntByReference len = new IntByReference();
    if (!lib.CryptSignHashA(hashHandle, keySpec, null, flags, null, len))
      throw raiseError("CryptSignHash", getLastError());
    final byte[] sign = new byte[len.getValue()];
    if (!lib.CryptSignHashA(hashHandle, keySpec, null, flags, sign, len))
      throw raiseError("CryptSignHash", getLastError());
    return sign;
  }
-- end of class Advapi


Похоже, проблема была в том, что я не передавал пароль на контейнер. С беспарольным контейнером все работает.
Ошибка была со значением 0 - непонятно почему. Видимо, глючит JNA, проверю на досуге. Пришлось писать код на Си++ и смотреть на ошибки.
Продолжу тестирование с другими сертификатами.

ОФФТОПИК: Вот только я не понял, как создать несколько контейнеров. И правда ли, что в одном контейнере может быть только один ключ? И как импортировать ключи с созданием контейнера, если я например экспортировал их на дискетку под виндой? Буду курить мануалы, но если кто быстро ответит на вопросы - буду благодарен, так как ограничен во времени сильно :(
Offline cross  
#4 Оставлено : 30 марта 2011 г. 17:21:52(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
Пин задается CryptSetProvParam(PP_KEYEXCHANGE_PIN). Без пина не будет доступа к закрытому ключу = нету подписи.
Вам стоит заглянуть в примеры из дев пакета. Там есть готовые куски кода для многих типичных действий.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline Роман кислухин  
#5 Оставлено : 30 марта 2011 г. 17:46:38(UTC)
Роман кислухин

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

Группы: Участники
Зарегистрирован: 29.03.2011(UTC)
Сообщений: 170
Мужчина
Откуда: Москва

Сказал «Спасибо»: 8 раз
Поблагодарили: 3 раз в 3 постах
cross написал:
Пин задается CryptSetProvParam(PP_KEYEXCHANGE_PIN). Без пина не будет доступа к закрытому ключу = нету подписи.
Вам стоит заглянуть в примеры из дев пакета. Там есть готовые куски кода для многих типичных действий.


Спасибо, собственно там и взял сишный код для тестирования и определения проблем.
Про ПИН понял, надо будет вкрутить в систему.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.