В РАБОТЕ
Использование ключей на Рутокене
rtengine
позволяет использовать ключи, расположенные на токене. В зависимости от операции будет выбран открытый или закрытый ключ соответственно.
Оба ключа пары должны иметь одинаковый идентификатор объекта и/или имя объекта. Ключевая пара идентифицируется с помощью 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 |
Генерация ключевой пары в файл
Формат команды:
openssl genpkey -algorithm alg -pkeyopt opt:value -out filename.pem |
Описание параметров:
Параметр | Описание |
---|---|
-algorithm | Алгоритм шифрования |
-pkeyopt | Параметры алгоритма (размер ключа, тип эллиптической кривой, и т.д.) |
-out | Название файла, в который будет записана ключевая пара. По умолчанию создается в том же каталоге, откуда была вызвана команда. Чтобы сохранить файл в другой каталог, укажите в параметре
|
Генерация ключевой пары ГОСТ в файл
Пример:
|
Значения параметров:
Параметр | Возможные значения |
---|---|
-algorithm |
|
-pkeyopt |
|
Генерация ключевой пары ECDSA в файл
Пример:
|
Значения параметров:
Параметр | Возможные значения | |
---|---|---|
-algorithm |
| |
-pkeyopt |
|
Генерация ключевой пары RSA в файл
Пример:
|
Значения параметров:
Параметр | Возможные значения |
---|---|
-algorithm |
|
-pkeyopt |
|
Генерация ключевой пары на Рутокене
Генерация ключевой пары ГОСТ
Через OpenSSL генерация ключевой пары ГОСТ на Рутокене пока не поддерживается. Используйте для этого pkcs11-tool из состава OpenSC.
Формат команды:
pkcs11-tool --module mod --login --pin pin --keypairgen --key-type specification --id id --usage-derive |
Описание параметров:
Параметр | Описание |
---|---|
--module | Модуль или библиотека PKCS #11, которая будет использована для генерации ключевой пары |
--login, -l | Параметр используется, чтобы потребовать аутентификацию на токене перед выполнением операции. Параметр --login не обязателен, если используется параметр --pin |
--pin, -p | PIN-код, который будет использован для подтверждения генерации ключевой пары. Использование параметра --pin автоматически включает параметр --login |
--keypairgen, -k | Тип операции (генерация новой ключевой пары) |
--key-type | Тип и параметры алгоритма шифрования (размер ключа, параметры эллиптической кривой, и т.д.) |
--id, -d | Откуда берётся ID? Или он задаётся пользователем самостоятельно? Зачем нужна часть про «использовать этот id через OpenSSL», если тут мы используем pkcs11-tool? Идентификатор объекта (CKA_ID) в виде двузначных номеров символов в hex из таблицы ASCII. |
--usage-derive | Параметр указывает на то, что на сгенерированном ключе можно вырабатывать общий симметричный ключ, который может использоваться, например, для расшифрования CMS-сообщений. Если шифрование сообщений на генерируемой ключевой паре не планируется, этот параметр можно не использовать. |
ГОСТ-2001
Пример:
|
Значения параметров:
Параметр | Возможные значения |
---|---|
--key-type |
|
--id | Нужна ли конвертация в ASCII? |
ГОСТ-2012
Собирайте ветку pkcs11-tool с поддержкой ГОСТ-2012, или используйте релиз OpenSC 0.20.0 или новее.
Пример:
|
Значения параметров:
Параметр | Возможные значения |
---|---|
--key-type | Для алгоритма
Для алгоритма
|
--id | Для удобства, можно воспользоваться онлайн-сервисом конвертации ACSII-кодов в строку. Почему выше (и ниже) конвертация строки в коды, а тут кодов в строку? |
или
используйте веб-сервис "Центр регистрации Рутокен"
Для чего?
Генерация ключевой пары ECDSA
Пример:
pkcs11-tool --module /путь/к/librtpkcs11ecp.so --login --pin 12345678 --keypairgen --key-type EC:secp256r1 --id 3132 --usage-derive
Значения параметров:
Параметр | Возможные значения |
---|---|
--module | Для Windows: Для Linux: |
--key-type | Для Рутокен ЭЦП 3.0 3110 и 3220:
Для Рутокен ЭЦП 3.0 3120:
|
--id | Нужна конвертация в ASCII? |
Генерация ключевой пары RSA
Пример:
pkcs11-tool --module /путь/к/librtpkcs11ecp.so --login --pin 12345678 --keypairgen --key-type RSA:2048 --id 3132
Значения параметров:
Параметр | Возможные значения |
---|---|
--module | Для Windows: Для Linux: |
--key-type | Для Рутокен ЭЦП 2.0:
Для Рутокен ЭЦП 3.0:
|
--id | Нужна конвертация в ASCII? |
Просмотр объектов на токене
Посмотреть записанные на токен объекты можно с помощью команды:
|
Формирование запроса PKCS#10
Сформировать запрос можно:
- с помощью ключа в файле:
openssl req -utf8 -new -key privatekey.pem -out req.csr
- с помощью ключа на Рутокене:
openssl req -utf8 -new -keyform engine -key "pkcs11:your_pkcs11_uri" -engine rtengine -out req.csr
Формат параметра
-key
описан в разделе "Использование ключей на Рутокене"
В процессе работы команда попросит ввести PIN-код. После этого потребуется указать данные для сертификата.
Набор вводимой информации при формировании запроса определяется конфигурационным файлом openssl.cnf
. По умолчанию нужно указать следующую информацию:
State or Province []: Moscow
Locality []: RU
Organization Name []: Aktiv Company
Organizational Unit Name []: development
Common Name []: tester
Email []: tester@rutoken.ru
Есть ли у этих полей обязательные значения (= можно ли вместо Moscow/RU/Aktiv Company указать условно Aaaaa/AU/Some Company)? Или стоит здесь рассказать про CA и флаг match в конфиге?
https://docs.openssl.org/1.0.2/man1/ca/#policy-format
Выпуск самоподписанного сертификата по запросу
Самоподписанный сертификат можно выпустить:
- с помощью ключа в файле:
openssl req -utf8 -x509 -key /путь/к/файлу/privatekey.pem -out cert.cer
- с помощью ключа на Рутокене:
openssl req -utf8 -x509 -keyform engine -key "pkcs11:your_pkcs11_uri" -engine rtengine -out cert.cer -subj "/C=RU/ST=Moscow/L=Moscow/O=Aktiv/OU=devNN/CN=testuser/emailAddress=testuser@mail.com"
Параметры сертификата:
Параметр | Описание |
---|---|
| CountryName Страна |
ST | StateOrProvinceName Регион или область |
L | Locality Населенный пункт (город, село, поселок и т.д.) |
O | Organization Название организации |
OU | OrganizationalUnit Название отдела в организации |
CN | CommonName Имя владельца сертификата |
emailAddress | Почтовый адрес владельца сертификата |
Работе с подписью в формате CMS
Создание подписи
Для создания CMS подписи необходимо иметь сертификат. В тестовых целях в папке sdk\openssl\samples\tool\
предоставлены настройки удостоверяющего центра OpenSSL, который позволяет выпускать сертификаты.
Для того, чтобы создать CMS-подпись с помощью предоставленного УЦ:
- Скопируйте папку
sdk\openssl\samples\tool\demoCA
и конфигурационный файлopenssl.cnf
в папку с OpenSSL. - Выполните команду:
openssl ca -batch -in req.csr -out cert.cer
- Создайте CMS подпись:
- с помощью ключа в файле:
openssl cms -sign -binary -nosmimecap -in data_to_sign -out signed_cms -outform PEM -inkey seckey.pem -signer cert.cer
- с помощью ключа на Рутокене:
openssl cms -sign -binary -nosmimecap -in data_to_sign -out signed_cms -outform PEM -keyform engine -inkey "pkcs11:your_pkcs11_uri" -engine rtengine -signer cert.cer
- с помощью ключа в файле:
Используя -nodetach
подписываемые данные включаются в состав CMS пакета — присоединенная подпись. Без этой опции подпись будет «отсоединенной».
Используя -nocerts
сертификат подписанта не включается в состав CMS пакета.
Проверка подписи
openssl cms -verify -binary -in signed_cms -inform PEM -out verified_data -CAfile demoCA/cacert.pem -content data_to_sign
Файл, указанный в -CAfile
, является доверенным сертификатом удостоверяющего центра и используется для проверки сертификата подписанта.
В опцию -content
передается файл с подписанными данными, если он не был включен в состав CMS пакета.
Если сертификат подписанта не был включен в CMS пакет (отсоединенная подпись), он указывается в опции -certfile.
Шифрование в формате CMS
Зашифрование
Шифрование на ключах с Рутокена
При расшифровании сообщения вырабатывается общий симметричный ключ, который непосредственно и используется при расшифровке. Рутокен позволяет генерировать такой общий ключ только на не извлекаемых закрытых ключах с опцией 'derive' в поле key usage. Для того чтобы указать эту опцию, при генерации ключа используйте флаг --usage-derive. Например:
pkcs11-tool.exe --module rtPKCS11ECP.dll --login --pin 12345678 --keypairgen --key-type GOSTR3410-2012-256:B --id 3132
--usage-derive
openssl cms -encrypt -binary -<alg> -in test_data -out encrypted_cms -outform PEM respondent.cer
respondent.cer:
сертификат адресата, для которого шифруется сообщение.
Где alg
может принимать значения:
Для ГОСТ:
gost28147-paramset_a-cfb (для rtengine 0.7):
алгоритм, работает в режиме гаммирования с обратной связью с набором параметров А.
gost28147-cfb (для rtengine новее 0.7):
алгоритм, работает в режиме гаммирования с обратной связью с набором параметров Z.
Для RSA и ECDSA ключей:
-aes128 — AES-128.
-aes192 — AES-192.
-aes256 — AES-256.
-des — DES.
-des3 — Triple DES (3DES).
Расшифрование на стороне адресата
Расшифровать данные можно:
- с помощью ключа в файле:
openssl cms -decrypt -binary -in encrypted_cms -inform PEM -recip respondent.cer -inkey privatekey.pem -out decrypted_cms_data
- с помощью ключа на Рутокене:
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
«Сырая» подпись данных
Подписать данные «сырой» подписью можно:
- с помощью ключа в файле:
openssl dgst -sign privatekey.pem -out file_to_sign.signature file_to_sign.txt
- с помощью ключа на Рутокене:
openssl dgst -keyform engine -sign "pkcs11:your_pkcs11_uri" -engine rtengine -out file_to_sign.signature file_to_sign.txt
Алгоритм хеша будет зависеть от алгоритма ключа.
Проверка «сырой подписи»
- Получите открытый ключ из закрытого:
openssl pkey -in privatekey.pem -pubout -out publickey.pem
- Проверьте подпись:
- с помощью ключа в файле:
openssl dgst -verify publickey.pem -signature signed_file.signature signed_file.txt
- с помощью ключа на Рутокене:
openssl dgst -keyform engine -verify "pkcs11:your_pkcs11_uri" -engine rtengine -signature signed_file.signature signed_file.txt
- с помощью ключа в файле:
Запуск SSL/TLS сервера
Формат команды:
openssl s_server -key filename|uri [-keyform format] [-engine id] -cert infile -Verify int -CAfile file -accept val -WWW -purpose purpose -4 |
Описание параметров:
Параметр | Описание |
---|---|
-key | Название файла или URI закрытого ключа. Если параметр не задан, будет использован файл сертификата |
-keyform | Формат файла закрытого ключа. Значение по умолчанию: PEM |
-engine | Модуль для работы с криптографическими алгоритмами. Задается, если задан параметр |
-cert | Путь к сертификату |
-Verify | Глубина проверки цепочки сертификатов |
-CAfile | Путь к доверенному сертификату |
-accept | TCP-порт, который будет прослушиваться в ожидании запросов. Значение по умолчанию: 4433 |
-WWW | Эмуляция простого веб-сервера |
-purpose | Назначение сертификата. Возможные значения:
|
-4 | Использовать только IPv4 |
Примеры команд:
openssl s_server -key demoCA/private/cakey.pem -cert demoCA/cacert.pem -Verify 7 -CAfile demoCA/cacert.pem -accept 44330 -WWW -purpose any -4
openssl s_server -key "pkcs11:server_key_pkcs11_uri" -keyform engine -engine rtengine -cert demoCA/cacert.pem -Verify 7 -CAfile demoCA/cacert.pem -accept 44330 -WWW -purpose any -4
Запуск SSL/TLS клиента
Формат команды:
openssl s_client -key filename|uri [-keyform format] [-engine id] -cert filename -host hostname -port port |
Описание параметров:
Параметр | Описание |
---|---|
-key | Название файла или URI закрытого ключа. Если параметр не задан, будет использован файл сертификата |
-keyform | Формат файла закрытого ключа. Значение по умолчанию: PEM |
-engine | Модуль для работы с криптографическими алгоритмами. Задается, если задан параметр |
-cert | Путь к сертификату |
-host | Адрес сервера, с которым нужно установить соединение |
-port | Порт сервера, с которым нужно установить соединение |
Примеры команд:
openssl s_client -key privatekey.pem -cert cert.cer -host 127.0.0.1 -port 44330
openssl s_client -key "pkcs11:client_key_pkcs11_uri" -keyform engine -engine rtengine -cert cert.cer -host 127.0.0.1 -port 44330