JaCarta/ГОСТ
- Токен: JaCarta-2 ГОСТ
библиотека libjcPKCS11-2.so.2.4.0 обеспечивает взаимодействие с криптопровайдером токена по стандарту PKCS#11; криптопровайдер токена осуществляет функции подписи секретным ключом передаваемых ему данных; секретный ключ при этом не покидает пределов токена;
Пакеты для работы с JaCarta-2 ГОСТ
Установить утилиту для работы с аппаратными токенами Jacarta ГОСТ и библиотеку libjcPKCS11:
# apt-get install jacarta-tools jcPKCS11-2
--module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0
Значения PIN-кодов по умолчанию
PIN-коды JaCarta-2 ГОСТ, установленные по умолчанию — Пользователь: 1234567890; Администратор:
Проверка работы 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-2 GOST
token manufacturer : Aladdin R.D.
token model : JaCarta GOST 2.0
token flags : login required, rng, token initialized, PIN initialized, readonly, other flags=0x800
hardware version : 1.0
firmware version : 2.5
serial num : 4E3900214083304C
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)
Просмотреть имеющуюся на токене информацию можно при помощи команды (требуется пароль от токена):
$ 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
Список объектов в определенном слоте:
$ pkcs11-tool -Ol --slot-index 0 --module /usr/lib64/pkcs11/libjcPKCS11-2.so.2.4.0
Генерация пары ключей:
$ 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,1.2.643.2.2.34.6,1.2.643.3.7.0.1.12,1.2.643.3.7.8.1" \
--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,1.2.643.2.2.34.6,1.2.643.3.7.0.1.12,1.2.643.3.7.8.1" \
--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
КриптоПро
Электронный идентификатор 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]
Будет необходимо предъявить PIN-код пользователя:
Проверить наличие контейнеров можно с помощью команды:
$ 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
Удалить контейнер можно с помощью команды:
$ csptest -keyset -deletekeyset -cont '\\.\Aladdin R.D. JaCarta [SCR Interface] 00 00\jacarta_2012'
Управление сертификатами
Создание запроса на получение сертификата
Создать запрос на физическое лицо, используя открытый ключ, сгенерированный в контейнере jacarta_2012 криптопровайдером «Crypto-Pro GOST R 34.10-2012 KC1 CSP» (тип — 80) и сохранить его в файл jacarta2012.req, назначение ключа — аутентификация и защита электронной почты:
$ cryptcp -creatrqst -dn "CN=Иванов Иван Иванович,SN=Иванов,G=Иван Иванович,E=ivanov@mail.mail,C=RU,L=Калининград,ST=39 Калининградская обл.,street=Пр-т Победы 14 кв.3,SNILS=102301111222,INN=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
Тот же запрос, используя OID:
$ cryptcp -creatrqst -dn "OID.2.5.4.3=Иванов Иван Иванович,OID.2.5.4.4=Иванов,OID.2.5.4.42=Иван Иванович,1.2.840.113549.1.9.1=ivanov@mail.mail,OID.2.5.4.6=RU,OID.2.5.4.8=39 Калининградская обл.,OID.2.5.4.7=Калининград,OID.2.5.4.9=Пр-т Победы 14 кв.3,OID.1.2.643.3.131.1.1=102301111222,OID.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]