Использование ключей на Рутокене
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
Если подключен только один Рутокен с единственной ключевой парой:
pkcs11:model=Rutoken%20ECP
В зависимости от операции будет выбран открытый или закрытый ключ соответственно. Оба ключа пары должны иметь одинаковый идентификатор объекта и/или имя объекта.
Генерация ключевой пары ГОСТ в файл
openssl genpkey -algorithm gost2012_256 -pkeyopt paramset:A -out seckey.pem
Укажите алгоритм, используя опцию -algorithm.
Укажите параметры эллиптической кривой (парамсет) с помощью -pkeyopt.
Поддерживаются следующие значения алгоритмов и соответствующих им парамсетов:
gost2001: A,B,C,XA,XB
gost2012_256: A,B,C,XA,XB
gost2012_512: A,B
Генерация ключевой пары ГОСТ на Рутокене
Через OpenSSL пока не поддерживается. Для генерации на Рутокене используйте pkcs11-tool из состава OpenSC.
Генерация ключевой пары ГОСТ-2001 на Рутокене
pkcs11-tool.exe --module rtPKCS11ECP.dll --login --pin 12345678 --keypairgen --key-type GOSTR3410:A --id 3132
pin
: PIN-код Рутокена
id
: идентификатор объекта (CKA_ID) в виде двузначных номеров символов в hex из таблицы ASCII.
Чтобы использовать этот id через OpenSSL надо использовать символы, соответствующие этим кодам.
Например: для ‘--id 3132
’ в OpenSSL надо указывать "pkcs11:id=12
".
GOSTR3410:A
: ‘A’ - парамсет, может быть так же B или С
Генерация ключевой пары ГОСТ-2012 на Рутокене
Info |
---|
Используйте ветку pkcs11-tool с поддержкой ГОСТ-2012 пока она не влита в master OpenSC |
pkcs11-tool.exe --module rtPKCS11ECP.dll --login --pin 12345678 --keypairgen --key-type GOSTR3410-2012-256:B --id 3132
pin
: PIN-код Рутокена
id
: идентификатор объекта (CKA_ID) в виде двузначных номеров символов в hex из таблицы ASCII.
Чтобы использовать этот id через OpenSSL надо использовать символы, соответствующие этим кодам.
Например: для ‘--id 3132
’ в OpenSSL надо указывать "pkcs11:id=12
".
GOSTR3410-2012-512:A
: ‘A’ - парамсет, может быть так же B или С,
GOSTR3410-2012-256:B
: ‘B’ - парамсет, может быть так же C или D
или
используйте веб-сервис "Центр регистрации Рутокен"
Для просмотра объектов на токене:
pkcs11-tool.exe --module rtPKCS11ECP.dll -Ol
Формирование запроса PKCS#10
Используя ключ в файле:
openssl req -utf8 -new -key seckey.pem -out req.csr
Используя ключ на Рутокене:
openssl req -utf8 -new -keyform engine -key "pkcs11:your_pkcs11_uri" -engine rtengine -out req.csr
Формат параметра -key
описан в разделе "Использование ключей на Рутокене"
В процессе работы команда попросит ввести PIN-код. После этого потребуется указать данные для сертификата:
State or Province []: Moscow
Locality []: RU
Organization Name []: Aktiv Company
Organizational Unit Name []: development
Common Name []: tester
Email []: tester@rutoken.ru
Набор вводимой информации при формировании запроса определяется конфигурационным файлом openssl.cnf
.
Выпуск самоподписанного сертификата по запросу
Используя ключ в файле:
openssl req -utf8 -x509 -key seckey.pem -out cert.cer
Используя ключ на Рутокене:
openssl req -utf8 -x509 -keyform engine -key "pkcs11:your_pkcs11_uri" -engine rtengine -out cert.cer
Создание подписи в формате CMS
Для создания CMS подписи необходимо иметь сертификат. В тестовых целях в папке sdk\openssl\rtengine\samples\tool\
предоставлены настройки удостоверяющего центра OpenSSL, который позволяет выпускать сертификаты.
Скопируйте папке sdk\openssl\rtengine\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 пакета.
Проверка подписи в формате 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.
«Сырая» подпись данных
Используя ключ в файле:
openssl dgst -sign seckey.pem -out signature data_to_sign
Используя ключ на Рутокене:
openssl dgst -keyform engine -sign "pkcs11:your_pkcs11_uri" -engine rtengine -out signature data_to_sign
Алгоритм хеша будет зависеть от алгоритма ключа.
Проверка «сырой подписи»
Получить открытый ключ из закрытого можно следующей командой:
openssl pkey -in seckey.pem -pubout -out pubkey.pem
Проверка используя ключ в файле:
openssl dgst -verify pubkey.pem -signature signature data_to_sign
Используя ключ на Рутокене:
openssl dgst -keyform engine -verify "pkcs11:your_pkcs11_uri" -engine rtengine -signature signature test_data
Шифрование в формате CMS
openssl cms -encrypt -binary -gost28147-paramset_a-cfb -in test_data -out encrypted_cms -outform PEM respondent.cer
respondent.cer:
сертификат адресата, для которого шифруется сообщение.
gost28147-paramset_a-cfb:
единственный доступный алгоритм, работает в режиме гаммирования с обратной связью с набором параметров А.
Расшифрование на стороне адресата:
Используя ключ в файле:
openssl cms -decrypt -binary -in encrypted_cms -inform PEM -recip respondent.cer -inkey seckey.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