ESMART
- Токен: ESMART Token ГОСТ
библиотека libisbc_pkcs11_main.so обеспечивает взаимодействие с криптопровайдером токена по стандарту PKCS#11; ESMART Token ГОСТ может использоваться для генерации ключей, формирования и проверки электронной подписи, строгой многофакторной аутентификации пользователей и др. Российские криптографические алгоритмы ГОСТ реализованы нативно в ОС смарт-карты в маске чипа (не используются Java апплеты для реализации ГОСТ).
Значения PIN-кодов по умолчанию
PIN-коды ESMART Token ГОСТ, установленные по умолчанию — Пользователь (pin): 12345678; Администратор (so-pin): 12345678
Работа с ESMART Token ГОСТ утилитой pkcs11-tool
Пакеты для работы с ESMART Token ГОСТ
Должна быть установлена библиотека libisbc_pkcs11_main.so:
# apt-get install isbc-pkcs11
--module /usr/lib64/pkcs11/libisbc_pkcs11_main.so
Проверка работы ESMART Token ГОСТ
Проверяем работу токена, он должен быть виден в списке:
$ pkcs11-tool -L --module /usr/lib64/pkcs11/libisbc_pkcs11_main.so
Available slots:
Slot 0 (0x1): Generic CCID Reader [CCID Bulk Interface] 00 00
token label : EsmartToken
token manufacturer : ISBC
token model : ESMARTToken GOST
token flags : login required, rng, token initialized, PIN initialized
hardware version : 2.5
firmware version : 255.255
serial num : 346056D604154404
pin min/max : 4/8
Просмотреть имеющуюся на токене информацию можно при помощи команды (требуется пароль от токена):
$ pkcs11-tool -Ol --module /usr/lib64/pkcs11/libisbc_pkcs11_main.so
Using slot 0 with a present token (0x1)
Logging in to "EsmartToken".
Please enter User PIN:
Инициализация токена
Для инициализации токена следует выполнить команду (необходимо ввести so-pin карты 2 раза или передать его в качестве параметра --so-pin):
$ pkcs11-tool --init-token --label EsmartToken --module /usr/lib64/pkcs11/libisbc_pkcs11_main.so
Using slot 0 with a present token (0x1)
Please enter the new SO PIN:
Please enter the new SO PIN (again):
Token successfully initialized
Смена PIN-кода
Для смены PIN-кода необходимо выполнить команду (потребуется ввести текущий PIN-код, а затем дважды ввести новый):
$ pkcs11-tool --change-pin --module /usr/lib64/pkcs11/libisbc_pkcs11_main.so
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-код необходимо выполнить команду (потребуется ввести so-pin карты, а затем дважды ввести новый PIN-код):
$ pkcs11-tool --init-pin -l --module /usr/lib64/pkcs11/libisbc_pkcs11_main.so
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
Удаление объекта
Для удаления объекта необходимо указать его тип и идентификатор (id) или название (label). Открытый и закрытый ключ удаляются отдельно.
$ pkcs11-tool -b -y privkey --login --id 1024 --module /usr/lib64/pkcs11/libisbc_pkcs11_main.so
Типы объектов:
- privkey – закрытый ключ;
- pubkey – открытый ключ;
- cert – сертификат.
Создание ключевой пары
Создание ключевой пары по алгоритму ГОСТ:
$ pkcs11-tool --module /usr/lib64/pkcs11/libisbc_pkcs11_main.so --login --pin 12345678 --keypairgen --key-type GOSTR3410:A --id 0101 --label "my key"
Using slot 0 with a present token (0x1)
Key pair generated:
Private Key Object; GOSTR3410
PARAMS OID: 06072a850302022301
label: my key
ID: 0101
Usage: sign, unwrap
Public Key Object; GOSTR3410
PARAMS OID: 06072a850302022301
VALUE: a973f28ea2462781249fff1060d37276f23030e9766b54b8a14f0daa6fba6a7d
62f2481e00a3df35bdd6c75ed82e8e95f1a78e9db549c8ee55008cfd92d7abb2
label: my key
ID: 0101
Usage: verify, wrap
Создание ключевой пары RSA 1024:
$ pkcs11-tool --module /usr/lib64/pkcs11/libisbc_pkcs11_main.so --keypairgen --key-type rsa:1024 --login --id 2222 --label myrsakey
Using slot 0 with a present token (0x1)
Logging in to "EsmartToken".
Please enter User PIN:
Key pair generated:
Private Key Object; RSA
label: myrsakey
ID: 2222
Usage: decrypt, sign, unwrap
Public Key Object; RSA 1024 bits
label: myrsakey
ID: 2222
Usage: encrypt, verify, wrap
Сертификаты
Создание запроса на сертификат
Получение сертификата
Запрос на сертификат необходимо подписать в аккредитованном удостоверяющем центре.
Запись сертификата на карту
Подписанный сертификат необходимо записать на карту:
$ pkcs11-tool -w cert.cer -y cert --id 1024 --module /usr/lib64/pkcs11/libisbc_pkcs11_main.so
OpenSC требует сертификаты в двоичном формате (DER). При попытке записать файл в кодировке base64 (PEM), появляется сообщение об ошибке.
Сертификат можно переконвертировать при помощи OpenSSL:
PEM → DER
$ openssl x509 -inform pem -in cert.pem -out cert.cer
DER → PEM
$ openssl x509 -inform der -in cert.cer -out cert.pem
Чтение сертификата
Если на карте имеется сертификат, его можно прочитать командой:
$ pkcs11-tool -r cert.cer -y cert --login --id 0000 --label certificate --module /usr/lib64/pkcs11/libisbc_pkcs11_main.so
Создание и настройка входа через ssh
Предполагается что ssh-сервер запущен (на 192.168.3.108) и имеет настройки, принятые по умолчанию в ALT Linux.
- Вывести список открытых ключей на смарт-карте в формате OpenSSH:
$ ssh-keygen -D /usr/lib64/pkcs11/libisbc_pkcs11_main.so ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCHahc9HhA/DQkvJFShNHo2BJV3/cj0tmGNfj0RO3mCtRl8cgqvkb9N/4bJcfG3NiDR4T+x1MxmFxHcQXDstUwnF1mc40kabWz9d1a16dlwVmtFCKv0l2pK6MMX6igqtHnapGNvyUpsYSV4wXnMwevGNQGeq6l9AE+r18cEVx4KLQ==
- Добавить ключ на сервер в файл ~/.ssh/authorized_keys
- Подключение к серверу (необходимо будет ввести PIN):
$ ssh -I /usr/lib64/pkcs11/libisbc_pkcs11_main.so user@192.168.3.108 The authenticity of host '192.168.3.108 (192.168.3.108)' can't be established. ED25519 key fingerprint is SHA256:6wjAK3qjuaASBQOHaBLH5mZMeHP6cAjws4HI1Xr3vZc. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '192.168.3.108' (ED25519) to the list of known hosts. Enter PIN for 'EsmartToken': [user@host-15 ~]$
Для удобства на компьютере клиенте в файле ~/.ssh/config можно указать сокращение:
$ vim ~/.ssh/config
Host example
Hostname 192.168.3.108
PKCS11Provider /usr/lib64/pkcs11/libisbc_pkcs11_main.so
и вызывать просто:
$ssh example
Enter PIN for 'EsmartToken':
Last login: Tue Feb 26 14:04:32 2019 from 192.168.3.106
[user@host-15 ~]$
Утилита PKIClientCli
Изменение ПИН-кода:
$ PKIClientCli changepin --pin 12345678 --newpin 00000000
Success
Изменение SO PIN (PIN ) для смарт карты или токена:
$ PKIClientCli changesopin --sopin 12345678 --newsopin 00000000
Разблокировка PIN-кода:
$PKIClientCli unlockpin --sopin 12345678 --newpin 00000000
Поддерживаемые алгоритмы
Список поддерживаемых механизмов:
$ PKIClientCli listm
GOST28147, encrypt, decrypt
MAGMA_ECB, encrypt, decrypt
GOSTR3410_256, sign, verify
GOSTR3410_WITH_GOSTR3411_94, sign, verify
GOSTR3410_WITH_GOSTR3411_2012_256, sign, verify
RSA_PKCS_KEY_PAIR_GEN, keySize={1024,1024}, gen_key_pair
GOSTR3410_256_KEY_PAIR_GEN, gen_key_pair
RSA_PKCS, keySize={1024,2048}, encrypt, decrypt, sign, sign_recover, verify, verify_recover
RSA_X_509, keySize={1024,2048}, encrypt, decrypt
SHA_1, digest
MD5, digest
SHA256, digest
GOSTR3411_94, digest
SHA224, digest
SHA384, digest
SHA512, digest
GOSTR3411_2012_256, digest
AES_ECB, keySize={16,32}, encrypt, decrypt
AES_CBC, keySize={16,32}, encrypt, decrypt
AES_CBC_PAD, keySize={16,32}, encrypt, decrypt
DES_ECB, keySize={8,8}, encrypt, decrypt
DES_CBC, keySize={8,8}, encrypt, decrypt
DES_CBC_PAD, keySize={8,8}, encrypt, decrypt
DES3_ECB, keySize={16,16}, encrypt, decrypt
DES3_CBC, keySize={16,16}, encrypt, decrypt
DES3_CBC_PAD, keySize={16,16}, encrypt, decrypt
AES_KEY_GEN, keySize={16,32}, generate
DES_KEY_GEN, keySize={8,8}, generate
DES2_KEY_GEN, keySize={16,16}, generate
GOST28147_KEY_GEN, generate
ECDSA_KEY_PAIR_GEN, keySize={256,256}, gen_key_pair, ec_f_p, ec_namedcurve, ec_uncompress
ECDSA, keySize={256,256}, sign, verify, ec_f_p, ec_namedcurve, ec_uncompress
GOSTR3410_DERIVE
GOSTR3410_2012_DERIVE
GOST28147_MAC, sign, verify
GOST28147_KEY_WRAP
Генерация ключей
$ PKIClientCli genkey --pin <PIN> --keytype <Key type>
где Key type: GOST, GOST:256, GOST:512 или RSA:бит (512/1024/ и т.д) [по умолчанию GOST:256] Например :
$ PKIClientCli genkey --pin 12345678
Просмотр объектов (verbose 1 — показать подробную информацию, 0 — краткую):
$ PKIClientCli list --pin 12345678 --verbose 1
private key; GOSTR3410-2001
label: my key
ID: 0101
usage: SIGN, UNWRAP,
public key; GOSTR3410-2001
label: my key
ID: 0101
usage: VERIFY
Создание запроса на сертификат и импорт полученного сертификата
Команда создания запроса на сертификат:
$ PKIClientCli genkey --pin <PIN> --path <Путь к шаблону CSR> --csrpath <Путь к шаблону CSR> --pubkeyid <ID открытого ключа>
Шаблон CSR имеет вид:
# CSR template example for PKIClientCli
[DN]
# Distinguished Name section
#(ИНН)
1.2.643.3.131.1.1=395556660000
#(СНИЛС)
1.2.643.100.3=11223344556
#(Country)
2.5.4.6=RU
#(State)
2.5.4.8=39 Калининградская обл.
#(City)
2.5.4.7=Калининград
#(Street)
2.5.4.9=Пр-т Победы 14 кв.3
#(Organization)
2.5.4.10=
#(OU)
2.5.4.11=
#(Unstructured Name)
1.2.840.113549.1.9.2=
#(Title)
2.5.4.12=
#(email)
1.2.840.113549.1.9.1=ivanov@mail.mail
#(Given Name)
2.5.4.42=Иван Иванович
#(Surname)
2.5.4.4=Иванов
#(Common Name)
2.5.4.3=Иванов Иван Иванович
[ATTRIBUTES]
# CSR attributes section
#(challengePassword)
1.2.840.113549.1.9.7=
# GOST R 34.10-2012, 256 bit
1.2.643.7.1.1.2.2=FALSE
[EXTENSIONS]
# CSR extensiotns section
keyUsage=digitalSignature,keyEncipherment,nonRepudiation,dataEncipherment,keyAgreement=FALSE
# Extended Key Usage
#extKeyUsage=clientAuth,emailProtection=TRUE
2.5.29.37=DER:303006072A85030202220606082A8503030700010C06072A85030307080106082B0601050507030206082B06010505070304=TRUE
# Microsoft UPN
#1.3.6.1.4.1.311.20.2.3=user@local=FALSE
Например, создадим запрос на сертификат esmart.csr на основе данных записанных в шаблоне esmart.tmpl:
$ PKIClientCli csr --pin 12345678 --pubkeyid 0101 --path esmart.tmpl --csrpath esmart.csr
Success
Запрос на сертификат необходимо подписать в аккредитованном удостоверяющем центре.
$ openssl req -inform der -in esmart.csr -out esmart.pem
Для получения сертификата в УЦ (на примере тестового удостоверяющего центра КриптоПро), необходимо выполнить следующие действия:
- Откройте в браузере ссылку http://www.cryptopro.ru/certsrv (тестовый удостоверяющий центр КриптоПро).
- Нажмите ссылку «Отправить готовый запрос PKCS#10 или PKCS#7 в кодировке Base64»:
- Вставьте в поле «Base-64-шифрованный запрос сертификата» содержимое файла test5.req и нажмите кнопку «Выдать»:
- Сохраните файл по ссылке «Загрузить сертификат» (по умолчанию предлагается имя certnew.cer):
$ cat esmart.pem
MIIBMDCB4AIBADA2MRMwEQYDVQQDDApUZXN0IFVzZXI1MR8wHQYJKoZIhvcNAQkBFhBjYXNAYWx0
bGludXgub3JnMGMwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEDQwAEQDq5IAql+tHfVT7r
oz+P5dPgOUVXc7dg91nzGM7fkUBSKlapGO2A2xUDRUBHLtW/hBCiZsxdH3ydhzlZ6nhcbNKgPjA8
BgorBgEEAYI3AgEOMS4wLDAdBgNVHSUEFjAUBggrBgEFBQcDBAYIKwYBBQUHAwIwCwYDVR0PBAQD
AgTwMAgGBiqFAwICAwNBAFYnhGI6SsCwFRSl5p6EVnM7y6Hx9JGM6BFS4U3xTEGvzMK7yzk9j1kG
EKU7YZO5cFluPuDdi0WuYskhdz4SEg4=
Подписанный сертификат необходимо записать на карту:
$ PKIClientCli importcert --pin 12345678 --path certnew.cer
Matching key pair found. Following label and ID have been assigned to the certificate:
Certificate ID: 0101.
Certificate Label: my key.
Success
Подписание документов
Команда:
$ PKIClientCli pkcs7sign --pin <PIN> --inpath <файл> --outpath <файл> --certid <ID сертификата> --intcertids <ID1, ID2> --privkeyid <ID сертификата>
Основные опции:
--pin — PIN (PIN пользователя) для смарт карты или токена (обязательный);
--inpath — путь к файлу для подписи (обязательный);
--outpath — путь к файлу, где будет храниться подпись (обязательный);
--certid — ID объекта сертификата пользователя (обязательный);
--intcertids — промежуточные идентификаторы объекта сертификата (через запятую);
--detached — тип подписи, 0 — прикреплённая (по умолчанию), 1 — откреплённая;
--privkeyid — ID объекта закрытого ключа. Если не указан, будет найден автоматически по сертификату пользователя;
--noconfirm — не спрашивать подтверждение перед подписью, 0 — подтверждение необходимо (по умолчанию), 1 — пропустить подтверждение.
Создание прикреплённой (attached) подписи:
$ PKIClientCli pkcs7sign --pin 12345678 --inpath ./my_file.odt --outpath out.sign --certid 0101
File path: ./my_file.odt
File size: 8086
Created date: 2019-02-25 13:56:29
Modified date: 2019-02-25 13:56:29
Checksum: 287495846084353A1404776EFCBA61F0DC6FA4ACAA6F9B78DFBA6F023085ABC (GOST R 34.11-2012)
Certificate CN: Иванов Иван Иванович
Certificate serial: 120032DA694AB3BC3711A2AA3500000032DA69
Continue? [y/n or yes/no]: y
Success
Создание откреплённой (detached) подписи (если в команде не вводить обязательные поля, они будут запрошены):
$ PKIClientCli pkcs7sign --detached 1
Please enter PIN (User PIN):
Please enter path to file to be signed: my_file.odt
Please enter path to file where signature will be stored: my_sign.sig
Please enter user certificate ID: 0101
File path: my_file.odt
File size: 8256
Created date: 2019-02-26 16:58:16
Modified date: 2019-02-26 16:58:16
Checksum: 287495846084353A1404776EFCBA61F0DC6FA4ACAA6F9B78DFBA6F023085ABC (GOST R 34.11-2012)
Certificate CN: Иванов Иван Иванович
Certificate serial: 120032DA694AB3BC3711A2AA3500000032DA69
Continue? [y/n or yes/no]: y
Success
Проверка подписи
Команда:
$ PKIClientCli pkcs7verify --signature <файл>
Основные опции:
--signature — путь к файлу с подписью (обязательный);
--path — путь к файлу с откреплённой подписью;
--crldir — путь к каталогу с файлами CRL (--verifychain 1 также должен быть указан);
--verifychain — проверить цепочку сертификатов и CRL, 0 — не проверять (по умолчанию), 1 — проверять. Сертификат CA должен быть загружен как доверенный.
Проверка подписи:
$ PKIClientCli pkcs7verify --signature out.sig
Success
Проверка откреплённой подписи:
$ PKIClientCli pkcs7verify --signature my_sign.sig --path my_file.odt
Success
Хэш-функция
Команда:
PKIClientCli digest --path <файл> --mechanism <файл>
Основные опции:
--path — путь к файлу (обязательный);
--mechanism — механизм хэш-функции,полный список можно получить командой listm (обязательный).
Примеры:
$ PKIClientCli digest --path my_file.odt --mechanism GOSTR3411_2012_256
my_file.odt : A5BB085BB54D5A6A7A0E0A98680024F4E9FDDEFFCD4050DBFA53946F4370D124 : GOSTR3411_2012_256
Success
$ PKIClientCli digest --path my_file.odt --mechanism SHA256
my_file.odt : 61A620869E4AF332A8B11EBDF50D103CAEA2222DEA5AF72D39054544B9C8E25F : SHA256
Success
КриптоПро
Электронный идентификатор ESMART Token ГОСТ поддерживается в СКЗИ «КриптоПро CSP» в качестве ключевого носителя. Для этого необходимо установить модуль поддержки.
# apt-get install isbc-cryptoproV5*
Просмотр доступных считывателей:
$ 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 ACS ACR38U-CCID 00 00
ACS ACR38U-CCID 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]
Инициализация считывателя ACS ACR38U-CCID 00 00, где в параметре -add указано имя, которое было получено при просмотре доступных считывателей, в параметре -name указано удобное для обращения к считывателю имя, например, Esmart (под правами root):
# cpconfig -hardware reader -add 'ACS ACR38U-CCID 00 00' -name 'Esmart'
Adding new reader:
Nick name: ACS ACR38U-CCID 00 00
Name device: Esmart
Succeeded, code:0x0