JaCarta/ГОСТ: различия между версиями

Материал из ALT Linux Wiki
Нет описания правки
 
(не показано 13 промежуточных версий 3 участников)
Строка 8: Строка 8:
= Значения PIN-кодов по умолчанию =
= Значения PIN-кодов по умолчанию =


''PIN-коды JaCarta-2 ГОСТ, установленные по умолчанию — Пользователь: 1234567890; Администратор: ''
PIN-код пользователя по умолчанию (PIN): '''1234567890'''
 
PIN-код администратора (SO-PIN): '''не предусмотрен'''
 
=Утилита pkcs11-tool=
=Утилита pkcs11-tool=
Должны быть установлены пакеты:
<source lang="text" highlight="1"># apt-get install opensc</source>
В состав opensc входит универсальная утилита pkcs11-tool, которой можно «подложить», например, библиотеку PKCS#11 для работы с Jacarta ГОСТ 2.0 и с ее помощью «управлять» токенами JaCarta.


== Пакеты для работы с JaCarta-2 ГОСТ==
== Пакеты для работы с JaCarta-2 ГОСТ==
Строка 22: Строка 29:
Available slots:
Available slots:
Slot 0 (0x1ffff): Aladdin R.D. JaCarta [SCR Interface] 00 00
Slot 0 (0x1ffff): Aladdin R.D. JaCarta [SCR Interface] 00 00
   token label        : JaCarta-2 GOST
   token label        : JaCarta ГОСТ
   token manufacturer : Aladdin R.D.
   token manufacturer : Aladdin R.D.
   token model        : JaCarta GOST 2.0
   token model        : JaCarta GOST 2.0
   token flags        : login required, rng, token initialized, PIN initialized, readonly, other flags=0x800
   token flags        : login required, rng, token initialized, PIN initialized, other flags=0x800
   hardware version  : 1.0
   hardware version  : 1.0
   firmware version  : 2.5
   firmware version  : 2.53
   serial num        : 4E3900214083304C
   serial num        : 4E3900016432304C
   pin min/max        : 6/32
   pin min/max        : 6/32
Slot 1 (0x2ffff): Aladdin R.D. JaCarta [SCR Interface] 00 00
  token label        : JaCarta GOST
  token manufacturer : Aladdin R.D.
  token model        : JaCarta Laser
  token flags        : login required, token initialized, PIN initialized, readonly
  hardware version  : 1.0
  firmware version  : 1.0
  serial num        : 4E3900214083304C
  pin min/max        : 4/10
Slot 2 (0x3ffff):
  (empty)
Slot 3 (0x4ffff):
  (empty)
</source>
</source>


Строка 71: Строка 65:
   Usage:      verify, wrap
   Usage:      verify, wrap
</source>
</source>
Список объектов в определенном слоте:
<source lang="text" highlight="1">$ pkcs11-tool -Ol --slot-index 0 --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0</source>


==Инициализация токена==
==Инициализация токена==
{{Attention|При инициализации все данные с токена будут удалены!}}
Для инициализации токена следует выполнить команду (необходимо ввести so-pin карты 2 раза или передать его в качестве параметра --so-pin):
<source lang="text" highlight="1">$ pkcs11-tool --init-token --label Jacarta2 --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0
Using slot 0 with a present token (0x1)
Please enter the new SO PIN:
Please enter the new SO PIN (again):
Token successfully initialized


{{Note|Если используется комбинированная модель JaCarta-2 PKI/ГОСТ, необходимо в командах указывать --slot-index, т.к. по умолчанию используется слот с индексом 0}}
{{Note|Если используется комбинированная модель JaCarta-2 PKI/ГОСТ, необходимо в командах указывать --slot-index, т.к. по умолчанию используется слот с индексом 0}}
</source>
{{Attention|Если были забыты (заблокированы) пароли пользователя и администратора, то ключ JaCarta полностью теряет свой функционал, работать с ним больше не получится}}


==Смена PIN-кода==
==Смена PIN-кода==
Строка 98: Строка 82:


==Разблокировка PIN-кода==
==Разблокировка PIN-кода==
Для того чтобы разблокировать PIN-код необходимо выполнить команду (потребуется ввести so-pin карты, а затем дважды ввести новый PIN-код):
При разблокировке PIN-кода, только сбрасывается счётчик попыток ввода. Т.е., если пароль пользователя неизвестен, то даже с помощью пароля администратора, нельзя получить доступ к ключу. В данном случае поможет инициализация.
<source lang="text" highlight="1">$ pkcs11-tool --init-pin -l --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0
Using slot 0 with a present token (0x1)
Please enter SO PIN:
Please enter the new PIN:
Please enter the new PIN again:
User PIN successfully initialized
</source>


==Удаление объекта==
==Удаление объекта==
Строка 140: Строка 117:
===Создание запроса на сертификат===
===Создание запроса на сертификат===
Формирование запроса на сертификат:
Формирование запроса на сертификат:
<!--
  Желательно воздерживаться от использования в примерах любых приватных OID.
  Например, таких как:
  - 1.2.643.2.2.34.6 - приватный OID ПО "КриптоПро УЦ" http://oidref.com/1.2.643.2.2.34 - подробнее: www.cryptopro.ru/forum2/default.aspx?g=posts&t=1619
  - 1.2.643.3.7.0.1.12, 1.2.643.3.7.8.1 - приватные OID, которые назначает УЦ "СКБ Контур" https://oid.iitrust.ru/oid_search/16/ при выпуске сертификатов
  Примечание: 1.2.643.3.7.8.1 (Квалифицированный сертификат) вносит особую путаницу, когда его пытаются использовать вне "СКБ Контур".
              Например, можно выпустить самоподписанный сертификат с OID 1.2.643.3.7.8.1, но без удовлетворения требований RFC4491
              https://datatracker.ietf.org/doc/html/draft-deremin-rfc4491-bis-06#section-5
              и без присутствия доверенного УЦ в цепочке сертификатов - такой сертификат не будет "квалифицированным".
              Другие примеры:
              - https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=97465#post97465
              - https://fksrf.pro/info/196.html#rd4
-->
<source lang="text" highlight="1-15">$ jc_certreq --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0 -o csr5.der \
<source lang="text" highlight="1-15">$ jc_certreq --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0 -o csr5.der \
   --pin=1234567890 \
   --pin=1234567890 \
Строка 153: Строка 143:
   --dn "street=Пр-т Победы 14 кв.3" \
   --dn "street=Пр-т Победы 14 кв.3" \
   --ext "keyUsage=critical,digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment" \
   --ext "keyUsage=critical,digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment" \
   --ext "extendedKeyUsage=clientAuth,emailProtection,1.2.643.2.2.34.6,1.2.643.3.7.0.1.12,1.2.643.3.7.8.1" \
   --ext "extendedKeyUsage=clientAuth,emailProtection" \
   --ext "1.2.643.100.111=ASN1:UTF8String:JaCarta-2 GOST"
   --ext "1.2.643.100.111=ASN1:UTF8String:JaCarta-2 GOST"
Trying to load /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0
Trying to load /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0
Строка 188: Строка 178:
   --dn "2.5.4.9=Пр-т Победы 14 кв.3" \
   --dn "2.5.4.9=Пр-т Победы 14 кв.3" \
   --ext "keyUsage=critical,digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment" \
   --ext "keyUsage=critical,digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment" \
   --ext "extendedKeyUsage=1.3.6.1.5.5.7.3.2,1.3.6.1.5.5.7.3.4,1.2.643.2.2.34.6,1.2.643.3.7.0.1.12,1.2.643.3.7.8.1" \
   --ext "extendedKeyUsage=1.3.6.1.5.5.7.3.2,1.3.6.1.5.5.7.3.4" \
   --ext "1.2.643.100.111=ASN1:UTF8String:JaCarta-2 GOST"
   --ext "1.2.643.100.111=ASN1:UTF8String:JaCarta-2 GOST"
</source>
</source>
===Получение сертификата===
===Получение сертификата===
Запрос на сертификат необходимо подписать в аккредитованном удостоверяющем центре.
Запрос на сертификат необходимо подписать в аккредитованном удостоверяющем центре.
Строка 211: Строка 202:
<source lang="text" highlight="1">$ pkcs11-tool --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0 -O
<source lang="text" highlight="1">$ pkcs11-tool --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0 -O
</source>
</source>
=КриптоПро=
=КриптоПро=
Электронный идентификатор JaCarta ГОСТ поддерживается в СКЗИ «КриптоПро CSP» в качестве ключевого носителя. Для этого необходимо установить модуль поддержки.
Электронный идентификатор JaCarta ГОСТ поддерживается в СКЗИ «КриптоПро CSP» в качестве ключевого носителя. Для этого необходимо установить модуль поддержки (команда выполняется из папки с распакованным архивом КриптоПро см. [[КриптоПро#Установка]]):
<source lang="text" highlight="1"># apt-get install cprocsp-rdr-jacarta*</source>
<source lang="text" highlight="1"># apt-get install cprocsp-rdr-jacarta*</source>


Строка 267: Строка 259:
[ErrorCode: 0x00000000]
[ErrorCode: 0x00000000]
</source>
</source>
{{note|Если используется комбинированная модель JaCarta-2 PKI/ГОСТ, можно будет выбрать выбрать способ создания контейнера.
{{note|Если используется комбинированная модель JaCarta-2 PKI/ГОСТ, можно будет выбрать способ создания контейнера.


Создание неизвлекаемого контейнера:
Создание неизвлекаемого контейнера:
Строка 304: Строка 296:
<source lang="text" highlight="1">$ csptest -keyset -deletekeyset -cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012'
<source lang="text" highlight="1">$ csptest -keyset -deletekeyset -cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012'
</source>
</source>
==Управление сертификатами==
==Управление сертификатами==
===Создание запроса на получение сертификата===
===Создание запроса на получение сертификата===
Строка 309: Строка 302:
<source lang="text" highlight="1">$ cryptcp -creatrqst -dn "список имён полей" -cont 'путь к контейнеру' <название_файла>.csr</source>
<source lang="text" highlight="1">$ cryptcp -creatrqst -dn "список имён полей" -cont 'путь к контейнеру' <название_файла>.csr</source>
Например, создать запрос на физическое лицо, используя открытый ключ, сгенерированный в контейнере jacarta_2012 криптопровайдером «Crypto-Pro GOST R 34.10-2012 KC1 CSP» (тип — 80) и сохранить его в файл jacarta2012.req, назначение ключа — аутентификация и защита электронной почты:
Например, создать запрос на физическое лицо, используя открытый ключ, сгенерированный в контейнере jacarta_2012 криптопровайдером «Crypto-Pro GOST R 34.10-2012 KC1 CSP» (тип — 80) и сохранить его в файл jacarta2012.req, назначение ключа — аутентификация и защита электронной почты:
<source lang="text" highlight="1-13">$ cryptcp -creatrqst \
<source lang="text" highlight="1-5">$ cryptcp -creatrqst \
-dn "CN=Иванов Иван Иванович" \
-dn "E=ivanov@mail.mail,CN=Иванов Иван Иванович,SN=Иванов,G=Иван Иванович,C=RU,L=Калининград,ST=39 Калининградская обл.,street=Пр-т Победы 14 кв.3" \
-dn "SN=Иванов" \
-provtype 80 -nokeygen \
-dn "G=Иван Иванович" \
-dn "E=ivanov@mail.mail" \
-dn "C=RU,L=Калининград" \
-dn "ST=39 Калининградская обл." \
-dn "street=Пр-т Победы 14 кв.3" \
-dn "SNILS=102301111222" \
-dn "INN=11223344556" \
-provtype 80 -nokeygen \
-cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012' \
-cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012' \
-certusage "1.3.6.1.5.5.7.3.4,1.3.6.1.5.5.7.3.2" jacarta2012.req</source>
-certusage "1.3.6.1.5.5.7.3.4,1.3.6.1.5.5.7.3.2" jacarta2012.req</source>


Тот же запрос, используя OID (будет необходимо предъявить PIN-код пользователя):  
Тот же запрос, используя OID (будет необходимо предъявить PIN-код пользователя):  
<source lang="text" highlight="1-15">$ cryptcp -creatrqst \
<source lang="text" highlight="1-5">$ cryptcp -creatrqst \
-dn "2.5.4.3=Иванов Иван Иванович" \
-dn "2.5.4.3=Иванов Иван Иванович,2.5.4.4=Иванов,2.5.4.42=Иван Иванович,1.2.840.113549.1.9.1=ivanov@mail.mail,2.5.4.6=RU,2.5.4.8=39 Калининградская обл.,2.5.4.7=Калининград,2.5.4.9=Пр-т Победы 14 кв.3,1.2.643.3.131.1.1=102301111222,1.2.643.100.3=11223344556" \
-dn "2.5.4.4=Иванов" \
-dn "2.5.4.42=Иван Иванович" \
-dn "1.2.840.113549.1.9.1=ivanov@mail.mail" \
-dn "2.5.4.6=RU" \
-dn "2.5.4.8=39 Калининградская обл." \
-dn "2.5.4.7=Калининград" \
-dn "2.5.4.9=Пр-т Победы 14 кв.3" \
-dn "1.2.643.3.131.1.1=102301111222" \
-dn "1.2.643.100.3=11223344556" \
-provtype 80 -nokeygen \
-provtype 80 -nokeygen \
-cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012' \
-cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012' \
-certusage "1.3.6.1.5.5.7.3.4,1.3.6.1.5.5.7.3.2" \
-certusage "1.3.6.1.5.5.7.3.4,1.3.6.1.5.5.7.3.2" jacarta2012.req
jacarta2012.req
CryptCP 5.0 (c) "КРИПТО-ПРО", 2002-2018.
CryptCP 5.0 (c) "КРИПТО-ПРО", 2002-2018.
Утилита командной строки для подписи и шифрования файлов.
Утилита командной строки для подписи и шифрования файлов.
Строка 344: Строка 319:
[ErrorCode: 0x00000000]
[ErrorCode: 0x00000000]
</source>
</source>
===Получение сертификата в УЦ и его установка===
===Получение сертификата в УЦ и его установка===
Запрос на сертификат необходимо подписать в аккредитованном удостоверяющем центре.  
Запрос на сертификат необходимо подписать в аккредитованном удостоверяющем центре.  
Запись сертификата клиента в контейнер:
Запись сертификата клиента в контейнер:
<source lang="text" highlight="1">$ certmgr -inst -file certnew.cer -store uMy -cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012' -inst_to_cont
<source lang="text" highlight="1">$ cryptcp -instcert -provtype 80 -cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012' -ku -askpin certnew.cer</source>
 
Ассоциировать сертификат с контейнером, сертификат попадет в пользовательское хранилище uMy:
<source lang="text" highlight="1">certmgr -inst -file certnew.cer -store uMy -cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012' -inst_to_cont
Certmgr 1.1 (c) "Crypto-Pro",  2007-2018.
Certmgr 1.1 (c) "Crypto-Pro",  2007-2018.
program for managing certificates, CRLs and stores
program for managing certificates, CRLs and stores
Строка 404: Строка 384:
==Создание и проверка подписи==
==Создание и проверка подписи==
Для создания электронной подписи файла необходимо указать сертификат и имя подписываемого файла:
Для создания электронной подписи файла необходимо указать сертификат и имя подписываемого файла:
<source lang="text" highlight="1">$ $ cryptcp -sign -dn E=ivanov@mail.mail -der my_file.odt  
<source lang="text" highlight="1">$ cryptcp -sign -dn E=ivanov@mail.mail -der my_file.odt  
CryptCP 5.0 (c) "КРИПТО-ПРО", 2002-2018.
CryptCP 5.0 (c) "КРИПТО-ПРО", 2002-2018.
Утилита командной строки для подписи и шифрования файлов.
Утилита командной строки для подписи и шифрования файлов.
Строка 418: Строка 398:
Подписанное сообщение успешно создано.
Подписанное сообщение успешно создано.
[ErrorCode: 0x00000000]</source>
[ErrorCode: 0x00000000]</source>
На выходе появится файл {path|my_file.odt.sig}}, содержащий как сам подписываемый файл, так и электронную подпись.  
На выходе появится файл {{path|my_file.odt.sig}}, содержащий как сам подписываемый файл, так и электронную подпись.  
Для проверки прикреплённой подписи выполните команду:
Для проверки прикреплённой подписи выполните команду:
<source lang="text" highlight="1">$ cryptcp -verify my_file.odt.sig
<source lang="text" highlight="1">$ cryptcp -verify my_file.odt.sig

Текущая версия от 18:37, 14 июля 2022

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.


  • Токен: JaCarta-2 ГОСТ
   библиотека libjcPKCS11-2.so.2.4.0 обеспечивает взаимодействие с криптопровайдером токена по стандарту PKCS#11;
   криптопровайдер токена осуществляет функции подписи секретным ключом передаваемых ему данных; секретный ключ при этом не покидает пределов токена;

Значения PIN-кодов по умолчанию

PIN-код пользователя по умолчанию (PIN): 1234567890

PIN-код администратора (SO-PIN): не предусмотрен

Утилита pkcs11-tool

Должны быть установлены пакеты:

# apt-get install opensc

В состав opensc входит универсальная утилита pkcs11-tool, которой можно «подложить», например, библиотеку PKCS#11 для работы с Jacarta ГОСТ 2.0 и с ее помощью «управлять» токенами JaCarta.

Пакеты для работы с JaCarta-2 ГОСТ

Установить утилиту для работы с аппаратными токенами Jacarta ГОСТ и библиотеку libjcPKCS11:

# apt-get install jacarta-tools jcPKCS11-2
Примечание: При работе с JaCarta-2 ГОСТ необходимо указывать путь до библиотеки libjcPKCS11-2.so:
--module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0


Проверка работы JaCarta-2 ГОСТ

Проверяем работу токена, он должен быть виден в списке:

$ pkcs11-tool -L --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0
Available slots:
Slot 0 (0x1ffff): Aladdin R.D. JaCarta [SCR Interface] 00 00
  token label        : JaCarta ГОСТ
  token manufacturer : Aladdin R.D.
  token model        : JaCarta GOST 2.0
  token flags        : login required, rng, token initialized, PIN initialized, other flags=0x800
  hardware version   : 1.0
  firmware version   : 2.53
  serial num         : 4E3900016432304C
  pin min/max        : 6/32

Просмотреть имеющуюся на токене информацию можно при помощи команды (требуется пароль от токена):

$ pkcs11-tool -Ol --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0
Using slot 0 with a present token (0x1ffff)
Logging in to "JaCarta-2 GOST".
Please enter User PIN: 
Certificate Object; type = X.509 cert
  label:      
  subject:    DN: CN=\xd0\x98\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xbe\xd0\xb2 \xd0\x98\xd0\xb2\xd0\xb0\xd0\xbd \xd0\x98\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xb8\xd1\x87, C=RU, L=\xD0\xB3. \xD0\x9A\xD0\xB0\xD0\xBB\xD0\xB8\xD0\xBD\xD0\xB8\xD0\xBD\xD0\xB3\xD1\x80\xD0\xB0\xD0\xB4/street=\xd0\x9f\xd1\x80-\xd1\x82 \xd0\x9f\xd0\xbe\xd0\xb1\xd0\xb5\xd0\xb4\xd1\x8b 14 \xD0\xBA\xD0\xB2. 3, emailAddress=ivanov@mail.mail
  ID:         0101
Public Key Object; GOSTR3410 
  PARAMS OID: 06072a850302022301
  VALUE:      5c6a95785381c6e97f188b5c1bda5b452984c57846b6439455847b6852078138
              0cf4b6e0bae04ce05234e18c608613a839945056875fd3f38fb32ae3130bc705
  label:      key
  ID:         0123
  Usage:      verify
Private Key Object; GOSTR3410 
  PARAMS OID: 06072a850302022301
  label:      key
  ID:         0123
  Usage:      sign
Public Key Object; RSA 0 bits
  label:      
  ID:         56504b4f5f4944
  Usage:      verify, wrap

Инициализация токена

Примечание: Если используется комбинированная модель JaCarta-2 PKI/ГОСТ, необходимо в командах указывать --slot-index, т.к. по умолчанию используется слот с индексом 0
Внимание! Если были забыты (заблокированы) пароли пользователя и администратора, то ключ JaCarta полностью теряет свой функционал, работать с ним больше не получится


Смена PIN-кода

Для смены PIN-кода необходимо выполнить команду (потребуется ввести текущий PIN-код, а затем дважды ввести новый):

$ pkcs11-tool --change-pin --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0
Using slot 0 with a present token (0x1)
Please enter the current PIN: 
Please enter the new PIN: 
Please enter the new PIN again: 
PIN successfully changed

Разблокировка PIN-кода

При разблокировке PIN-кода, только сбрасывается счётчик попыток ввода. Т.е., если пароль пользователя неизвестен, то даже с помощью пароля администратора, нельзя получить доступ к ключу. В данном случае поможет инициализация.

Удаление объекта

Для удаления объекта необходимо указать его тип и идентификатор (id) или название (label). Открытый и закрытый ключ удаляются отдельно.

$ pkcs11-tool -b -y privkey --login --id 1024 --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0

Типы объектов:

  • privkey – закрытый ключ;
  • pubkey – открытый ключ;
  • cert – сертификат.

Создание ключевой пары

Генерация пары ключей:

$ pkcs11-tool --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0 --login --pin 1234567890 --keypairgen --key-type GOSTR3410:A --id 0101 --label "my key"
Using slot 0 with a present token (0x1ffff)
Key pair generated:
Private Key Object; GOSTR3410 
  PARAMS OID: 06072a850302022301
  label:      my key
  ID:         0101
  Usage:      sign


Public Key Object; GOSTR3410 
  PARAMS OID: 06072a850302022301
  VALUE:      5c6a95785381c6e97f188b5c1bda5b452984c57846b6439455847b6852078138
              0cf4b6e0bae04ce05234e18c608613a839945056875fd3f38fb32ae3130bc705
  label:      my key
  ID:         0101

  Usage:      verify

Сертификаты

Создание запроса на сертификат

Формирование запроса на сертификат:

$ jc_certreq --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0 -o csr5.der \
  --pin=1234567890 \
  --dn "INN=395556660000" \
  --dn "SNILS=11223344556" \
  --dn "emailAddress=ivanov@mail.mail" \
  --dn "CN=Иванов Иван Иванович" \
  --dn "SN=Иванов" \
  --dn "2.5.4.42=Иван Иванович" \
  --dn "C=RU" \
  --dn "L=Калининград" \
  --dn "ST=39 Калининградская обл." \
  --dn "street=Пр-т Победы 14 кв.3" \
  --ext "keyUsage=critical,digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment" \
  --ext "extendedKeyUsage=clientAuth,emailProtection" \
  --ext "1.2.643.100.111=ASN1:UTF8String:JaCarta-2 GOST"
Trying to load /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0
jcPKCS11-2 library initialized.
Applet GOST2 found in slot 131071
Open session: OK
Login: OK
Key 1:
  Label: test
  ID: 0123
Key 2:
  Label: my key
  ID: 0101
Key 3:
  Label: 
  ID: 56504b4f5f4944
Please, select public key: 2
Create CSR: OK
Write CSR to file: OK

Можно использовать OID для формирования запроса на сертификат:

$ jc_certreq --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0 -o csr.der \
  --pin=1234567890 \
  --dn "1.2.643.3.131.1.1=391506390000" \
  --dn "1.2.643.100.3=11223344556" \
  --dn "1.2.840.113549.1.9.1=ivanov@mail.mail" \
  --dn "2.5.4.3=Иванов Иван Иванович" \
  --dn "2.5.4.4=Иванов" \
  --dn "2.5.4.42=Иван Иванович" \
  --dn "2.5.4.6=RU" \
  --dn "2.5.4.7=Калининград" \
  --dn "2.5.4.8=39 Калининградская обл." \
  --dn "2.5.4.9=Пр-т Победы 14 кв.3" \
  --ext "keyUsage=critical,digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment" \
  --ext "extendedKeyUsage=1.3.6.1.5.5.7.3.2,1.3.6.1.5.5.7.3.4" \
  --ext "1.2.643.100.111=ASN1:UTF8String:JaCarta-2 GOST"

Получение сертификата

Запрос на сертификат необходимо подписать в аккредитованном удостоверяющем центре.

Запись сертификата

Запись сертификата на токен:

$ pkcs11-tool --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0 --pin 1234567890 --write-object ./cert.der --type cert --id 0101
Using slot 0 with a present token (0x1ffff)
Created certificate:
Certificate Object; type = X.509 cert
  label:      
  subject:    DN: CN=\xd0\x98\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xbe\xd0\xb2 \xd0\x98\xd0\xb2\xd0\xb0\xd0\xbd \xd0\x98\xd0\xb2\xd0\xb0\xd0\xbd\xd0\xbe\xd0\xb2\xd0\xb8\xd1\x87, C=RU, L=\xD0\xB3. \xD0\x9A\xD0\xB0\xD0\xBB\xD0\xB8\xD0\xBD\xD0\xB8\xD0\xBD\xD0\xB3\xD1\x80\xD0\xB0\xD0\xB4/street=\xd0\x9f\xd1\x80-\xd1\x82 \xd0\x9f\xd0\xbe\xd0\xb1\xd0\xb5\xd0\xb4\xd1\x8b 14 \xD0\xBA\xD0\xB2. 3, emailAddress=ivanov@mail.mail
  ID:         0101

Чтение сертификата

Если на карте имеется сертификат, его можно прочитать командой:

$ pkcs11-tool --read-object --type cert --login --id 0101 --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0

ID сертификата можно посмотреть, выведя список объектов на токене:

$ pkcs11-tool --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0 -O

КриптоПро

Электронный идентификатор JaCarta ГОСТ поддерживается в СКЗИ «КриптоПро CSP» в качестве ключевого носителя. Для этого необходимо установить модуль поддержки (команда выполняется из папки с распакованным архивом КриптоПро см. КриптоПро#Установка):

# apt-get install cprocsp-rdr-jacarta*

Управление считывателями

Просмотр доступных считывателей:

$ csptest -enum -info -type PP_ENUMREADERS | iconv -f cp1251
CSP (Type:80) v5.0.10001 KC1 Release Ver:5.0.11319 OS:Linux CPU:AMD64 FastCode:READY:AVX.
CryptAcquireContext succeeded.HCRYPTPROV: 34658307
GetProvParam(...PP_ENUMREADERS...) until it returns false
  Len    Byte  NickName/Name
_____________________________
 0x012a  0x03  Aladdin R.D. JaCarta [SCR Interface] 00 00
               Aladdin R.D. JaCarta [SCR Interface] 00 00
 0x012a  0x01  FLASH
               FLASH
 0x012a  0x00  HDIMAGE
               HDD key storage
Cycle exit when getting data. 3 items found. Level completed without problems.
Total: SYS: 0,000 sec USR: 0,070 sec UTC: 0,090 sec
[ErrorCode: 0x00000000]

Инициализация считывателя Aladdin R.D. JaCarta [SCR Interface] 00 00, где в параметре -add указано имя, которое было получено при просмотре доступных считывателей, в параметре -name указано удобное для обращения к считывателю имя, например, JaCarta (под правами root):

# cpconfig -hardware reader -add 'Aladdin R.D. JaCarta [SCR Interface] 00 00' -name 'JaCarta'
Adding new reader:
Nick name: Aladdin R.D. JaCarta [SCR Interface] 00 00
Name device: JaCarta
Succeeded, code:0x0

Управление контейнерами

Создание контейнера на токене/смарт-карте:

$ csptest -keyset -provtype 80 -newkeyset -cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012'
CSP (Type:80) v5.0.10001 KC1 Release Ver:5.0.11319 OS:Linux CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 17975555
GetProvParam(PP_NAME): Crypto-Pro GOST R 34.10-2012 KC1 CSP
Container name: "jacarta_2012"
Signature key is not available.
Attempting to create a signature key...
a signature key created.
Exchange key is not available.
Attempting to create an exchange key...
an exchange key created.
Keys in container:
  signature key
  exchange key
Extensions:
  OID: 1.2.643.2.2.37.3.9
  PrivKey: Not specified - 25.02.2022 11:48:48 (UTC)

  OID: 1.2.643.2.2.37.3.10
  PrivKey: Not specified - 25.02.2022 11:49:13 (UTC)
Total: SYS: 0,060 sec USR: 0,120 sec UTC: 48,390 sec
[ErrorCode: 0x00000000]
Примечание: Если используется комбинированная модель JaCarta-2 PKI/ГОСТ, можно будет выбрать способ создания контейнера.

Создание неизвлекаемого контейнера:

Выбор носителя для создания контейнера

В этом случае будет использована встроенная криптография носителя.

Создание обычного контейнера:

Выбор носителя для создания контейнера

В этом случае см. JaCarta/PKI


Будет необходимо предъявить PIN-код пользователя:

Запрос PIN-кода пользователя для аутентификации на носителе

Внимание! Если используется комбинированная модель JaCarta-2 PKI/ГОСТ: при выборе неизвлекаемого контейнера запрашивается PIN JaCarta ГОСТ, во втором случае JaCarta PKI


Проверить наличие контейнеров можно с помощью команды:

$ csptest -keyset -enum_cont -fqcn -verifyc | iconv -f cp1251
CSP (Type:80) v5.0.10001 KC2 Release Ver:5.0.11319 OS:Linux CPU:AMD64 FastCode:READY:AVX.
AcquireContext: OK. HCRYPTPROV: 22886451
\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012
OK.
Total: SYS: 0,010 sec US

Просмотр подробной информации о контейнере:

$ csptestf -keyset -container '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012' -info

Удалить контейнер можно с помощью команды:

$ csptest -keyset -deletekeyset -cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012'

Управление сертификатами

Создание запроса на получение сертификата

Создание запроса на получение сертификата средствами КриптоПро (будет необходимо предъявить PIN-код пользователя):

$ cryptcp -creatrqst -dn "список имён полей" -cont 'путь к контейнеру' <название_файла>.csr

Например, создать запрос на физическое лицо, используя открытый ключ, сгенерированный в контейнере jacarta_2012 криптопровайдером «Crypto-Pro GOST R 34.10-2012 KC1 CSP» (тип — 80) и сохранить его в файл jacarta2012.req, назначение ключа — аутентификация и защита электронной почты:

$ cryptcp -creatrqst \
-dn "E=ivanov@mail.mail,CN=Иванов Иван Иванович,SN=Иванов,G=Иван Иванович,C=RU,L=Калининград,ST=39 Калининградская обл.,street=Пр-т Победы 14 кв.3" \
-provtype 80 -nokeygen \
-cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012' \
-certusage "1.3.6.1.5.5.7.3.4,1.3.6.1.5.5.7.3.2" jacarta2012.req

Тот же запрос, используя OID (будет необходимо предъявить PIN-код пользователя):

$ cryptcp -creatrqst \
-dn "2.5.4.3=Иванов Иван Иванович,2.5.4.4=Иванов,2.5.4.42=Иван Иванович,1.2.840.113549.1.9.1=ivanov@mail.mail,2.5.4.6=RU,2.5.4.8=39 Калининградская обл.,2.5.4.7=Калининград,2.5.4.9=Пр-т Победы 14 кв.3,1.2.643.3.131.1.1=102301111222,1.2.643.100.3=11223344556" \
-provtype 80 -nokeygen \
-cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012' \
-certusage "1.3.6.1.5.5.7.3.4,1.3.6.1.5.5.7.3.2" jacarta2012.req
CryptCP 5.0 (c) "КРИПТО-ПРО", 2002-2018.
Утилита командной строки для подписи и шифрования файлов.
Запрос успешно создан и сохранен в файле.
[ErrorCode: 0x00000000]

Получение сертификата в УЦ и его установка

Запрос на сертификат необходимо подписать в аккредитованном удостоверяющем центре.

Запись сертификата клиента в контейнер:

$ cryptcp -instcert -provtype 80 -cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012' -ku -askpin certnew.cer

Ассоциировать сертификат с контейнером, сертификат попадет в пользовательское хранилище uMy:

certmgr -inst -file certnew.cer -store uMy -cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012' -inst_to_cont
Certmgr 1.1 (c) "Crypto-Pro",  2007-2018.
program for managing certificates, CRLs and stores

WARNING: Legacy parameter: "-inst_to_cont"
Installing: 
=============================================================================
1-------
Issuer              : E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2
Subject             : CN=Иванов Иван Иванович, SN=Иванов, G=Иван Иванович, E=ivanov@mail.mail, C=RU, S=39 Калининградская обл., L=Калининград, STREET=Пр-т Победы 14 кв.3, INN=102301111222, SNILS=11223344556
Serial              : 0x120032E69FDDCE99C696B58F0B00000032E69F
SHA1 Hash           : 84c33d2d04e9bf89a58c3b312f0f818d07bca0ff
SubjKeyID           : 55e495cc2491d57c05153a41439039f32da17e14
Signature Algorithm : ГОСТ Р 34.11/34.10-2001
PublicKey Algorithm : ГОСТ Р 34.10-2012 (512 bits)
Not valid before    : 27/02/2019  13:41:47 UTC
Not valid after     : 27/05/2019  13:51:47 UTC
PrivateKey Link     : No                  
CA cert URL         : http://testca.cryptopro.ru/CertEnroll/test-ca-2014_CRYPTO-PRO%20Test%20Center%202.crt
OCSP URL            : http://testca.cryptopro.ru/ocsp/ocsp.srf
CDP                 : http://testca.cryptopro.ru/CertEnroll/CRYPTO-PRO%20Test%20Center%202.crl
Extended Key Usage  : 1.3.6.1.5.5.7.3.4
                      1.3.6.1.5.5.7.3.2
=============================================================================

[ErrorCode: 0x00000000]

Установка сертификата удостоверяющего центра:

$ certmgr -inst -file uc.p7b -store uRoot
Certmgr 1.1 (c) "Crypto-Pro",  2007-2018.
program for managing certificates, CRLs and stores

Installing: 
=============================================================================
1-------
Issuer              : E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2
Subject             : E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2
Serial              : 0x2B6E3351FD6EB2AD48200203CB5BA141
SHA1 Hash           : 046255290b0eb1cdd1797d9ab8c81f699e3687f3
SubjKeyID           : 15317cb08d1ade66d7159c4952971724b9017a83
Signature Algorithm : ГОСТ Р 34.11/34.10-2001
PublicKey Algorithm : ГОСТ Р 34.10-2001 (512 bits)
Not valid before    : 05/08/2014  13:44:24 UTC
Not valid after     : 05/08/2019  13:54:03 UTC
PrivateKey Link     : No                  
=============================================================================

[ErrorCode: 0x00000000]

Просмотр сертификатов

Для просмотра установленных сертификатов можно воспользоваться командой:

$ certmgr -list

Создание и проверка подписи

Для создания электронной подписи файла необходимо указать сертификат и имя подписываемого файла:

$ cryptcp -sign -dn E=ivanov@mail.mail -der my_file.odt 
CryptCP 5.0 (c) "КРИПТО-ПРО", 2002-2018.
Утилита командной строки для подписи и шифрования файлов.

Будет использован следующий сертификат:
Субъект:11223344556, 102301111222, Пр-т Победы 14 кв.3, Калининград, 39 Калининградская обл., RU, ivanov@mail.mail, Иван Иванович, Иванов, Иванов Иван Иванович
Действителен с 27.02.2019 13:41:47 по 27.05.2019 13:51:47

Цепочки сертификатов проверены.
Папка './':
my_file.odt... Подпись данных...    
    
Подписанное сообщение успешно создано.
[ErrorCode: 0x00000000]

На выходе появится файл my_file.odt.sig, содержащий как сам подписываемый файл, так и электронную подпись. Для проверки прикреплённой подписи выполните команду:

$ cryptcp -verify my_file.odt.sig
CryptCP 5.0 (c) "КРИПТО-ПРО", 2002-2018.
Утилита командной строки для подписи и шифрования файлов.

Найдено сертификатов: 2
Цепочки сертификатов проверены.
Папка './':
my_file.odt.sig... Проверка подписи...     
Автор подписи: 11223344556, 102301111222, Пр-т Победы 14 кв.3, Калининград, 39 Калининградская обл., RU, ivanov@mail.mail, Иван Иванович, Иванов, Иванов Иван Иванович
 Подпись проверена.
[ErrorCode: 0x00000000]

Для извлечения файла с данными из файла электронной подписи необходимо указать имя файла, в который будут извлечены данные, в конце команды проверки подписи:

$ cryptcp -verify my_file.odt.sig new_file.odt

Для создания откреплённой (detached) подписи необходимо заменить ключ -sign на -signf:

$ cryptcp -signf -dn E=ivanov@mail.mail -der my_file.odt

Проверка откреплённой подписи:

$ cryptcp -vsignf my_file.odt