Предварительная подготовка
Перед началом работы, установите следующие пакеты:
# для ubuntu |
Загрузите модуль librtpkcs11ecp.so и установите:
|
Проверьте наличие libpkcs11.so по пути: /usr/lib64/engines-1.1/. Если ее нет, то для начала установите libpkcs11.so для того, чтобы OpenSSL смог общаться к Рутокеном.
Для этого соберите библиотеку libp11 из репозитория. Вместе с ней идет libpkcs11.so начиная с версии 0.4.
Использование ключей на Рутокене
pkcs11-engine позволяет использовать ключи, расположенные на токене.
Ключевая пара идентифицируется с помощью pkcs11 uri.
Возможные компоненты идентификатора пути:
manufacturer: ID производителя токена
model: модель токена
serial: серийный номер токена
token: метка токена(поле "label")
object: имя объекта(CKA_LABEL)
id: идентификатор объекта (CKA_ID)
Пример идентификатора ключевой пары на токене:
pkcs11:manufacturer=Aktiv%20Co.;model=Rutoken%20ECP;serial=2adc8d87;object=my%20label;id=%aa%bb%cc%dd?pin-value=12345678
Если подключен только один Рутокен с единственной ключевой парой:
pkcs11:model=Rutoken%20ECP
В зависимости от операции будет выбран открытый или закрытый ключ соответственно. Оба ключа пары должны иметь одинаковый идентификатор объекта и/или имя объекта.
Создание ключей
Вы можете пропустить данный раздел, если у вас уже имеются необходимые RSA ключи.
Если ключей нет, ниже команда для их созданию:
|
id: идентификатор объекта (CKA_ID) в виде двузначных номеров символов в hex из таблицы ASCII.
Чтобы использовать этот id через OpenSSL надо использовать символы, соответствующие этим кодам.
Например: для ‘--id 3132’ в OpenSSL надо указывать "pkcs11:id=12".
Для удобства, можно воспользоваться онлайн-сервисом конвертации ACSII-кодов в строку.
Проверим сгенерированный ключ:
|
Создание сертификата и импорт его на токен через OpenSSL 1.1.x
Теперь нужно получить сертификат (путь до библиотеки pkcs11 может отличаться в зависимости от ОС):
- создайте самоподписанный сертификат:
|
- или создайте запрос на сертификат для передачи его в УЦ:
|
Создание сертификата и импорт его на токен через OpenSSL 3.x
Настраиваем конфигурационный файл по инструкции
Формируем самоподписанный сертификат или заявку на сертификат:
|
Сохраните сертификат на токене:
|
Создание подписи в формате CMS
Для создания CMS подписи необходимо иметь сертификат. Создание самоподписанного сертификата было описано выше.
В конфигурационный файл openssl.cnf (он может находится по пути /usr/lib/ssl/) необходимо внести следующие изменения:
openssl_conf = openssl_init
[openssl_init]engines = engine_section
[engine_section]pkcs11 = pkcs11_section
[pkcs11_section]engine_id = pkcs11dynamic_path = /path/to/engine_pkcs11.so //например, /usr/lib/x86_64-linux-gnu/engines-3/libpkcs11.soMODULE_PATH = /path/to/rtpkcs11ecp.so //например, /usr/lib/librtpkcs11ecp.sodefault_algorithms = ALL
Затем создайте CMS подпись используя ключ на Рутокене:
|
Используя -nodetach подписываемые данные включаются в состав CMS пакета — присоединенная подпись. Без этой опции подпись будет «отсоединенной».
Используя -nocerts сертификат подписанта не включается в состав CMS пакета.
Проверка подписи в формате CMS
|
Файл, указанный в -CAfile, является доверенным сертификатом удостоверяющего
центра и используется для проверки сертификата подписанта.
Если используется самоподписанный сертификат, то в эту опцию необходимо указать путь к файлу сертификата подписанта.
В опцию -content передается файл с подписанными данными, если он не был включен в состав CMS пакета.
Если сертификат подписанта не был включен в CMS пакет (отсоединенная подпись), он указывается в опции -certfile.
«Сырая» подпись данных
Используя ключ на Рутокене:
|
Алгоритм хеша будет зависеть от алгоритма ключа.
Проверка «сырой подписи»
Используя ключ на Рутокене:
|
Шифрование в формате CMS
Шифрование на ключах с Рутокена
При расшифровании сообщения вырабатывается общий симметричный ключ, который непосредственно и используется при расшифровке. Рутокен позволяет генерировать такой общий ключ только на не извлекаемых закрытых ключах с опцией 'derive' в поле key usage. Для того чтобы указать эту опцию, при генерации ключа используйте флаг --usage-derive. Например:
pkcs11-tool --module /usr/lib/librtpkcs11ecp.so --keypairgen --key-type rsa:2048 -l --id 3132 --usage-derive
|
respondent.cer: сертификат адресата, для которого шифруется сообщение.
Расшифрование на стороне адресата:
Используя ключ на Рутокене:
openssl cms -decrypt -binary -in encrypted_cms -inform PEM -recip respondent.cer -keyform engine -inkey "pkcs11:your_pkcs11_uri" -engine rtengine -out decrypted_cms_data