Re: Работа с ФСС по передаче данных о больничном

Здравствуйте, Ирина Казакевич.

Ирина Казакевич пишет:

То есть имеющийся ключ сгенерирован уже с таким параметром?

Да, при генерации ключей был установлен атрибут: CKA_DERIVE – FALSE.

Ирина Казакевич пишет:

Нужно обращаться к тому, кто выдал ключ?

Да, вам нужно будет обратиться в удостоверяющий центр, выпустивший электронную подпись для получения новой подписи, с правильным параметром.
Если у сотрудников удостоверяющего центра возникнут проблемы с изменением данного параметра, они могут обратиться к нам за консультацией.

Ирина Казакевич пишет:

Можно с помощью какой-то утилиты в этом убедится, что эта ЭЦП 2.0 имеет такой параметр False?

Для проверки войдите на ra.rutoken.ru и попробуйте подписать сертификатом документ: кнопка «Подписать» - выбираете файл.
Если подписать удалось – с сертификатом все в порядке.
Если подписать не удалось и появилась ошибка «Соответствующая сертификату ключевая пара не найдена», у ключей неверный параметр.

Посмотреть параметры, установленные в ключах, можно с помощью программы pkcs11admin. Мы можем удаленно подключиться и проверить правильность параметров или написать вам инструкцию по использованию этой программы.

(2021-06-21 14:29:47 отредактировано Ирина Казакевич)

Re: Работа с ФСС по передаче данных о больничном

Николай Киблицкий пишет:

Для проверки войдите на ra.rutoken.ru и попробуйте подписать сертификатом документ: кнопка «Подписать» - выбираете файл.
Если подписать удалось – с сертификатом все в порядке.
Если подписать не удалось и появилась ошибка «Соответствующая сертификату ключевая пара не найдена», у ключей неверный параметр.

Подписать документ с помощью данной ЭЦП возможно. Не получается осуществить шифрование для обмена с ФСС. Пока на этапе получения симметричного ключа шифрования на фукнции C_DeriveKey.

Николай Киблицкий пишет:

Посмотреть параметры, установленные в ключах, можно с помощью программы pkcs11admin. Мы можем удаленно подключиться и проверить правильность параметров или написать вам инструкцию по использованию этой программы.

Да, если можно, поясните, как посмотреть параметры приватного ключа. Т.к. через программу виден публичный ключ.

(2021-06-28 16:29:41 отредактировано Николай Киблицкий)

Re: Работа с ФСС по передаче данных о больничном

В ходе удаленного подключения убедились, что ключи записаны с неправильным параметром.
В данном случае необходимо обращаться в удостоверяющий центр выпустивший сертификат.

(2022-09-28 18:03:23 отредактировано serj965)

Re: Работа с ФСС по передаче данных о больничном

Добрый вечер. Также столкулся с проблемой генерации и шифрования сессионного ключа. Проблему генерации вроде понял как решать - нашёл пример в SDK, но как правильно его зашифровать публичным ключом ФСС - не понял.

Re: Работа с ФСС по передаче данных о больничном

serj965,

ФСС использует для передачи шифрованных сообщений  формат XML.

PKCS#11 умеет шифровать по ГОСТ 28147-89, но для обертки в формат XML нужны будут другие библиотеки.

Вам помогут примеры из комплекта разработчика Рутокен.
Для получения симметричного ключа шифрования из ключевой пары смотрите пример:
sdk\pkcs11\samples\Standard\VKO-GOST34.10-<Алгоритм>

Для шифрования:
sdk\pkcs11\samples\Standard\ EncDecGOST28147-89-<Алгоритм>

Re: Работа с ФСС по передаче данных о больничном

Спасибо. Получилось всё, кроме шифрования сообщения.

В случае использования session.Encrypt, параметризованного массивом байтов - возвращает ошибку 'Method C_Encrypt returned CKR_DATA_LEN_RANGE'.
В случае session.Encrypt, параметризованного потоками - возвращает Method C_EncryptFinal returned CKR_OPERATION_NOT_INITIALIZED'.

Наверное это по причине  непонимания мною PKCS#11. Думаю оставить затею самостоятельной реализации.

Re: Работа с ФСС по передаче данных о больничном

serj965,

Method C_Encrypt returned CKR_DATA_LEN_RANGE

Похоже вы шифруете сообщение или в CBC режиме, или в ECB. ECB не позволяет шифровать более 32 байтов информации, так как режим используется только для шифрования ключей.

ФСС использует CBC без мешинга -- CRYPT_MODE_CBC (а не CRYPT_MODE_CBCRFC4357).
У нас есть этот случай в примере на С:

/*************************************************************************
            * Для алгоритма ГОСТ 28147 механизм усложнения ключа предусматривает     *
            * преобразование синхропосылки через каждый килобайт данных.             *
            *                                                                        *
            * Для совместимости с КриптоПро CSP при использовании режима             *
            * CRYPT_MODE_CBC закомментировать следующие 5 строк кода                 *
            * (выбранный режим не осуществляет это преобразование)                   *
            *************************************************************************/
            printf("  Key Meshing(set IV)\n");
            rv = functionList->C_EncryptInit(session, &gost28147EncDecEcbMech, encKey);
            CHECK_AND_LOG("   C_EncryptInit", rv == CKR_OK, rvToStr(rv), free_encrypted);
            rv = functionList->C_Encrypt(session, encryptedRound, GOST28147_89_BLOCK_SIZE, encryptedRound, &blockSize);
            CHECK_AND_LOG("   C_Encrypt", rv == CKR_OK, rvToStr(rv), free_encrypted);

Method C_EncryptFinal returned CKR_OPERATION_NOT_INITIALIZED

Непоточное шифрование должно происходить при помощи вызова следующих функций:

  • C_EncryptInit;

  • C_Encrypt.

Поточное же шифрование производится вот так:

  • C_EncryptInit;

  • C_EncryptUpdate (0 или более раз);

  • C_EncryptFinal.


Похоже у вас следующий порядок вызовов:

  • C_EncryptInit;

  • C_Encrypt;

  • C_EncryptFinal.

Что и приводит к неинициализированной операции на последнем вызове, так как операция уже была трактована как непоточная.