# КриптоПро
[TOC]
## Настройка ЭЦП в Ubuntu
Для подключения ЭЦП к какому-либо сайту нам потребуется:
1) ЭЦП
2) КриптоПро
3) "Плагин"
4) "Расширение" для браузера
5) "Расширение" для браузера от Контура (для Диадок)
### Установка КриптоПро
[Скачиваем](https://www.cryptopro.ru/products/csp/downloads) архив с deb-пакетами x64 с оф. сайта, распаковываем, переходим в директорию со сценариями
```bash
# --- Устанавливаем Крипто-Про
sudo ./install_gui.sh
# Выбираем Next
# Отмечаем все пакеты, Next
# Install
# Ok
# Пропускаем ввод лицензии, Later
# Exit
# --- Устанавливаем драйвера РУТОКЕН
sudo apt-get install libccid pcscd libpcsclite1 pcsc-tools opensc
# --- Перезапускаем службу pcscd
sudo service pcscd restart
# --- Запускаем pcsc_scan (из состава драйверов РУТОКЕН) и можно вставить РУТОКЕН, должен отобразиться
pcsc_scan
# Using reader plug'n play mechanism
# Scanning present readers...
# 0: Aktiv Rutoken lite 00 00
#
# Wed Mar 4 20:40:21 2020
# Reader 0: Aktiv Rutoken lite 00 00
```
### "Плагин"
Полное название - *КриптоПро ЭЦП Browser Plug-in*
"Плагин" представляет собой программное обеспечение, которое обеспечивает связь между КриптоПро и браузером
Полезные ссылки:
https://cryptopro.ru/sites/default/files/products/cades/demopage/main.html
Ссылка для скачивания - https://cryptopro.ru/products/cades/plugin/get_2_0
Распаковываем и устанавливаем
```bash
tar -zxvf cades-linux-amd64.tar.gz
cd cades-linux-amd64
sudo dpkg -i cprocsp-pki-cades-64_2.0.14458-1_amd64.deb
sudo dpkg -i cprocsp-pki-plugin-64_2.0.14458-1_amd64.deb
```
### "Расширение" для браузера
Яндекс.Брайузер - https://addons.opera.com/ru/extensions/details/cryptopro-extension-for-cades-browser-plug-in/
Устанавливаем и проверяем работу:
![работа плагина](https://clck.ru/bnL7V)
### Диадок
При попытке войти в диадок - https://diadoc.kontur.ru - будет предложено скачать и установить deb-пакет.
Далее необходимо перезагрузиться и при повторном входе наблюдаем наши ЭЦП
![Вход в диадок](https://clck.ru/bnLCL)
## Разработка
> Проблема.
> Для того, чтобы работать с Крипто-ПРО в тестовом режиме, необходимо иметь тестовый сертификат и ключ. Для установки тестового сертификата в систему требуется установка корневого тестового сертификата УЦ. Корневой сертификат имеется, установка проходит корректно, но браузер его не видит при попытке установить в систему тестовый сертификат.
Страница скачивания - https://www.cryptopro.ru/products/csp/downloads
Тестовый УЦ - https://www.cryptopro.ru/certsrv/
Страница проверки сертификата - https://www.cryptopro.ru/sites/default/files/products/cades/demopage/simple.html
[Инструкция по установке КриптоПро CSP (оф. сайт)](https://www.cryptopro.ru/forum2/default.aspx?g=posts&t=11300)
[Установка и настройка КриптоПро в Ubuntu Linux 18.04](https://multiblog67.ru/raznoe/29-ubuntu/201-ustanovka-i-nastrojka-kriptopro-v-ubuntu-linux-18-04.html)
[Как я настраивал новые утилиты по работе с электронной подписью в Linux](https://habr.com/ru/company/aktiv-company/blog/323170/)
[Создание тестового сертификата КриптоПро](http://wiki.rosalab.ru/ru/index.php/Создание_тестового_сертификата_КриптоПро)
[Установка сертификатов используя КриптоПРО в Linux](http://renbuar.blogspot.com/2018/12/linux.html)
[Добавление корневых сертификатов в Ubuntu 18.04](https://internet-lab.ru/ubuntu_root_ca)
**[Работа с КриптоПро CSP](https://wiki.astralinux.ru/pages/viewpage.action?pageId=32833902)**
**[КриптоПро (от АльтЛинукс)](https://www.altlinux.org/КриптоПро)**
### Работаем с токенами
```bash
# --- Запускаем pcsc_scan (из состава драйверов РУТОКЕН) и можно вставить РУТОКЕН, должен отобразиться
pcsc_scan
# Using reader plug'n play mechanism
# Scanning present readers...
# 0: Aktiv Rutoken lite 00 00
#
# Wed Mar 4 20:40:21 2020
# Reader 0: Aktiv Rutoken lite 00 00
# Event number: 0
# Card state: Card inserted,
# ATR: 3B 8B 01 52 75 74 6F 6B 65 6E 6C 69 74 65 C2
#
# ATR: 3B 8B 01 52 75 74 6F 6B 65 6E 6C 69 74 65 C2
# + TS = 3B --> Direct Convention
# + T0 = 8B, Y(1): 1000, K: 11 (historical bytes)
# TD(1) = 01 --> Y(i+1) = 0000, Protocol T = 1
# -----
# + Historical bytes: 52 75 74 6F 6B 65 6E 6C 69 74 65
# Category indicator byte: 52 (proprietary format)
# + TCK = C2 (correct checksum)
#
# Possibly identified card (using /usr/share/pcsc/smartcard_list.txt):
# 3B 8B 01 52 75 74 6F 6B 65 6E 6C 69 74 65 C2
# Aktiv Rutoken Lite
# https://www.rutoken.ru/products/all/rutoken-lite/
# --- получаем модель подключенного токена
/opt/cprocsp/bin/amd64/csptest -card -enum -v -v
# Aktiv Rutoken lite 00 00
# Card present, ATR=3B 8B 01 52 75 74 6F 6B 65 6E 6C 69 74 65 C2
# Unknown applet
# Проверить наличие носителей с контейнерами в формате FQCN
/opt/cprocsp/bin/amd64/csptest -keyset -verifycontext -enum -unique
# CSP (Type:80) v5.0.10003 KC2 Release Ver:5.0.11455 OS:Linux CPU:AMD64 FastCode:READY:AVX.
# AcquireContext: OK. HCRYPTPROV: 8677507
# 23bcbffe5-92e7-01bb-450b-9774105bf2c|SCARD\rutoken_lt_36304bf6\0C00\E0D6
# --- копирование
/opt/cprocsp/bin/amd64/csptest -keycopy -contsrc '\\.\HDIMAGE\d6b6b5e14-d822-4a62-ae13-b21758a02fc' -contdest '\\.\Aktiv Rutoken lite 00 00\ivanoff'
# --- удаление
/opt/cprocsp/bin/amd64/csptestf -passwd -cont '\\.\Aktiv Rutoken lite 00 00\ivanoff' -deletek
```
### Работа с носителями и контейнерами
```bash
# список носителей с контейнерами
/opt/cprocsp/bin/amd64/csptest -keyset -enum_cont -fqcn -verifyc | iconv -f cp1251
# CSP (Type:80) v5.0.10003 KC2 Release Ver:5.0.11455 OS:Linux CPU:AMD64 FastCode:READY:AVX.
# AcquireContext: OK. HCRYPTPROV: 31340675
# \\.\Aktiv Rutoken lite 00 00\23bcbffe5-92e7-01bb-450b-9774105bf2c
# здесь `\\.\Aktiv Rutoken lite 00 00` - это имя носителя (токена), а `\\.\Aktiv Rutoken lite 00 00\23bcbffe5-92e7-01bb-450b-9774105bf2c` - имя контейнера
# просмотр подробной информации о контейнерах на носителе
/opt/cprocsp/bin/amd64/csptestf -keyset -container '\\.\Aktiv Rutoken lite 00 00' -info
# проверка работы контейнера
/opt/cprocsp/bin/amd64/csptestf -keyset -container '\\.\Aktiv Rutoken lite 00 00' -check
# удалить контейнер с носителя
/opt/cprocsp/bin/amd64/csptestf -passwd -cont '\\.\Aktiv Rutoken lite 00 00\23bcbffe5-92e7-01bb-450b-9774105bf2c' -deletek
# установка контейнера на носитель (из файла или архива)
# контейнер представляет собой директорию (может быть архив) с шестью key-файлами
# Для установки на носитель HDIMAGE достаточно скопировать их в директорию:
# /var/opt/cprocsp/keys/<username>/te-6ddfa.000/
# ├── header.key
# ├── masks2.key
# ├── masks.key
# ├── name.key
# ├── primary2.key
# └── primary.key
#
# контролируем наличие контейнера в списке:
/opt/cprocsp/bin/amd64/csptest -keys -enum -verifyc -fqcn
# ...
# \\.\HDIMAGE\te-6ddfa170-b353-4ddc-8483-9113322d538e
# ...
```
### Менеджер сертификатов
Существует 4 категории сертификатов
* личные сертификаты (ставятся в хранилище umy, где u = User, my - имя хранилища) - как правило для них есть закрытый ключ (и они требуют особой установки, чтобы в хранилище появилась ссылка на этот закрытый ключ). В результате с их использованием можно, например, подписать файл.
* корневые сертификаты - краеугольнй камень безопасности, так как цепочки доверия строятся от них, то их надо добавлять в хранилища осознанно и внимательно (ставятся в uroot, также администратор может поставить их в mroot, где m = Machine, такие сертификаты будут видны в read only в root-хранилищах всех пользователей)
* промежуточные сертификаты - появляются, когда есть промежуточные УЦ (головной -> промежуточный -> пользовательский). Прямое доверие к ним не требуется (ставятся в uca, также администратор может поставить их в mca). В это же хранилище ставятся CRL-и. Обычно точки получения промежуточных сертификатов и CRL-ей правильно указаны в пользовательских сертификатах, поэтому они автоматом выкачиваются и попадают в хранилище ucache. В общем про них можно ничего особо не знать и ничего не делать.
* сертификаты партнёров по общению, чтобы проверять их подписи и зашифровывать для них сообщения. Ставятся либо в umy (это беспорядок, но популярный), либо в uAddressBook
Основной утилитой для работы с сертификатами является `certmgr` (лежит в */opt/cprocsp/bin/<архитектура>*).
```bash
man 8 certmgr
# Установка всех личных сертификатов с Рутокена в uMy
/opt/cprocsp/bin/amd64/csptestf -absorb -cert -pattern 'rutoken'
# Установка определенного сертификата с определенного контейнера в uMy
/opt/cprocsp/bin/amd64/certmgr -inst -cont '\\.\Aktiv Rutoken lite 00 00\23bcbffe5-92e7-01bb-450b-9774105bf2c'
# Установка корневого сертификата:
/opt/cprocsp/bin/amd64/certmgr -inst -store root -file <путь к файлу с сертификатом>
/opt/cprocsp/bin/amd64/certmgr -inst -store uRoot -cert -file ~/Загрузки/<название файла>.cer
# Установка личного сертификата
/opt/cprocsp/bin/amd64/certmgr -inst -file <путь к файлу с сертификатом> -cont <имя контейнера>
# Пример команды
# --- контейнер был установлен также вручную, поэтому при установке сертификата
# необходимо явно его указать
/opt/cprocsp/bin/amd64/certmgr -inst -file ./CareSoul.cer -store uMy -cont '\\.\HDIMAGE\te-6ddfa170-b353-4ddc-8483-9113322d538e'
# Установка стороннего сертификата:
/opt/cprocsp/bin/amd64/certmgr -inst -file <путь к файлу с сертификатом>
# Установка сертификата удостоверяющего центра ГУЦ в mRoot
sudo curl https://structure.mil.ru/files/morf/military/files/guc18.cer \
| sudo /opt/cprocsp/bin/amd64/certmgr -inst -store mRoot -stdin
# Установка промежуточного сертификата МО в mca
sudo curl http://structure.mil.ru/download/doc/morf/military/files/CA2018.cer \
| sudo /opt/cprocsp/bin/amd64/certmgr -inst -store mca -stdin
# Установка списка отвызвов (CRL), ставим его с того же сайта в mca
sudo curl http://structure.mil.ru/download/doc/morf/military/files/crl_18.crl \
| sudo /opt/cprocsp/bin/amd64/certmgr -inst -store mca -stdin -crl
# просмотр сертификатов
/opt/cprocsp/bin/amd64/certmgr -list
# Просмотор корневых сертификатов:
/opt/cprocsp/bin/amd64/certmgr -list -store uRoot
# Удалить сертификат по номеру
/opt/cprocsp/bin/amd64/certmgr -delete
# удалить все сертификаты
/opt/cprocsp/bin/amd64/certmgr -delete -all
# ---
/opt/cprocsp/bin/amd64/certmgr -delete -store uRoot
/opt/cprocsp/bin/amd64/certmgr -delete -all -store uRoot
# --- Проверка цепочки сертификатов
/opt/cprocsp/bin/amd64/cryptcp -copycert -dn CN='Николай Михайличенко' -df /tmp/test.cer
# ...
# Цепочки сертификатов проверены.
# Копирование сертификатов завершено.
# --- экспорт сертификата в файл
/opt/cprocsp/bin/amd64/certmgr -export -cert -dest ivanoff.cer -dn "CN=Иван Иванов"
```
### Подпись
Подпись можно делать двумя способами:
* attached (присоединённая), тогда результирующий файл - это CMS-сообщение, внутрь которого упакованы данные и атрубуты (типа подписи). Формат сообщения соответствует международному стандарту, поэтому извлекать данные оттуда можно любыми утилитами, типа cryptcp / csptest / openssl / certutil (на windows).
> в файл "присоединенной" подписи добавляется исходное сообщение и сертификат
* detached (отсоединённая), тогда результирующий файл - это CMS-сообщение БЕЗ исходных данных, но с атрибутами (типа подписи). В этом случае для проверки надо "принести" исходный файл. Разумеется он остаётся неизменным и его можно смотреть cat-ом
> в файл "отсоединенной" подписи ничего не добавляется, только подпись
**cryptcp** - приложение командной строки для создания запросов на сертификаты, шифрования и расшифрования файлов, создания и проверки электронной подписи файлов с использованием сертификатов открытых ключей, хэширования файлов. Результатом работы приложения в большинстве случаев является файл с CMS-сообщением (PKCS#7) в кодировке DER или BASE64.
Приложение **cryptcp** поддерживает все современные криптографические алгоритмы, в том числе подпись по ГОСТ Р 34.10-2001 и по ГОСТ Р 34.10-2012 (256 бит и 512 бит), хэш по ГОСТ Р 34.11-94 и по ГОСТ Р 34.11-2012 (256 бит и 512 бит), а также подпись RSA, ECDSA, хэш SHA-1, SHA-2 и т.п.
Подробное руководство на cryptcp - https://yadi.sk/i/P-mZpvvoQ6PmAA
```bash
# подпись (присоединенная)
# в результате получим файл messsage.txt.sig, который будет содержать исходный файл, данные сертификата и саму подпись
/opt/cprocsp/bin/amd64/cryptcp -sign -dn 'CN=Николай Михайличенко' -der message.txt
# подпись (отсоединенная)
/opt/cprocsp/bin/amd64/cryptcp -sign -detach -dn 'CN=Николай Михайличенко' \
-pin 12345678 message.txt message.txt.sig
# проверка (присоединенная)
/opt/cprocsp/bin/amd64/cryptcp -verify message.txt.sig
# извлечение исходного файла из присоединенной подписи
/opt/cprocsp/bin/amd64/cryptcp -verify message.txt.sig message0.txt
# проверка (отсоединенная)
/opt/cprocsp/bin/amd64/cryptcp -verify -verall -detached message.txt message.txt.sig
/opt/cprocsp/bin/amd64/csptestf \
-sfsign -sign -in message.txt -out message.sign \
-my 'Николай Михайличенко' -detached -alg GOST12_256
# #0:
# Subject: E=nn.mikh@yandex.ru, CN=Николай Михайличенко, L=Krasnodar, S=Krasnodarskiy kray
# Valid : 05.03.2020 17:41:48 - 05.06.2020 17:51:48 (UTC)
# Issuer : E=support@cryptopro.ru, C=RU, L=Moscow, O=CRYPTO-PRO LLC, CN=CRYPTO-PRO Test Center 2
#
# A CSP has been acquired.
# Source message length: 12
# Calculated signature (or signed message) length: 700
# Signature was done. Signature (or signed message) length: 655
# Output file (message.sign) has been saved
# Total: SYS: 0,000 sec USR: 0,030 sec UTC: 0,200 sec
# [ErrorCode: 0x00000000]
# перечень поддерживаемых провайдеров для подписи (используется в -provtype 75)
/opt/cprocsp/sbin/amd64/cpconfig -defprov -view_type
# Listing Available Provider Types:
# Provider type Provider Type Name
# _____________ _____________________________________
# 75 GOST R 34.10-2001 Signature with Diffie-Hellman Key Exchange
# 80 GOST R 34.10-2012 (256) Signature with Diffie-Hellman Key Exchange
# 81 GOST R 34.10-2012 (512) Signature with Diffie-Hellman Key Exchange
# 16 ECDSA Full and AES
# 24 RSA Full and AES
```
### csptest
native
```bash
cat digest.txt
# R8RV8nchBdiz5SjtR3jUaffT64ZVj+Hb9AqPCfnSZss=
echo R8RV8nchBdiz5SjtR3jUaffT64ZVj+Hb9AqPCfnSZss= | base64 --decode > digest.bin
# ...
/opt/cprocsp/bin/amd64/csptest -keyset \
-sign GOST12_256 \
-cont "te-6ddfa170-b353-4ddc-8483-9113322d538e" \
-password hinoki123 \
-keytype exchange \
-in digest.bin \
-out digest.bin.sgn
# -verify GOST
/opt/cprocsp/bin/amd64/csptest -keyset \
-verifycontext \
-verify GOST12_256 \
-in digest.bin \
-signature digest.bin.sgn \
-certificate CareSoul.cer \
-keytype exchange
cat digest.bin.sgn | base64 -w 0
# FGFD/e8OOewUAJxeeIF8aP+BErSnQJuUqZhZb47JB5jAtaX9VkNLoQMLF3wKiU3bJp5gmfVoqaCTvnlRtfB1cQ==
curl --location --request POST 'https://rest-api-test.tinkoff.ru/e2c/AddCustomer' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'TerminalKey=1582835395702E2C' \
--data-urlencode 'CustomerKey=1' \
--data-urlencode 'DigestValue=R8RV8nchBdiz5SjtR3jUaffT64ZVj+Hb9AqPCfnSZss=' \
--data-urlencode 'SignatureValue=FGFD/e8OOewUAJxeeIF8aP+BErSnQJuUqZhZb47JB5jAtaX9VkNLoQMLF3wKiU3bJp5gmfVoqaCTvnlRtfB1cQ==' \
--data-urlencode 'X509SerialNumber=028f9c750083ab9eb04ee3d7173a34436b'
```
pipe
```bash
mkfifo /tmp/digest.bin
mkfifo /tmp/digest.bin.sgn
echo R8RV8nchBdiz5SjtR3jUaffT64ZVj+Hb9AqPCfnSZss= | base64 --decode > /tmp/digest.bin
# cat digest.bin > /tmp/digest.bin
cat /tmp/digest.bin.sgn | base64 -w 0
# cat /tmp/digest.bin.sgn > digest-pipe.sgn
/opt/cprocsp/bin/amd64/csptest -keyset \
-sign GOST12_256 \
-cont "te-6ddfa170-b353-4ddc-8483-9113322d538e" \
-password hinoki123 \
-keytype exchange \
-in /tmp/digest.bin \
-out /tmp/digest.bin.sgn
curl --location --request POST 'https://rest-api-test.tinkoff.ru/e2c/AddCustomer' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'TerminalKey=1582835395702E2C' \
--data-urlencode 'CustomerKey=1' \
--data-urlencode 'DigestValue=R8RV8nchBdiz5SjtR3jUaffT64ZVj+Hb9AqPCfnSZss=' \
--data-urlencode 'SignatureValue=rk0MTx6T4VJoJTYPO2AlsBo6wMvRSN8pAfVxgL/eJP1+siZlMrID8eWtb8JTgdRflp5vG1Yk2vbaWaaB00ydiw==' \
--data-urlencode 'X509SerialNumber=028f9c750083ab9eb04ee3d7173a34436b'
# === перегоняем Base64 через pipe
# --- загоняем в pipe бинарник в формате base64
cat digest.bin.sgn | base64 -w 0 > /tmp/digest.bin.sgn
# --- получаем base64 из пайпа и преобразуем бинарник
cat /tmp/digest.bin.sgn | base64 --decode > digest-pipe.sgn
# --- валидируем
/opt/cprocsp/bin/amd64/csptest -keyset \
-verifycontext \
-verify GOST12_256 \
-in digest.bin \
-signature digest-pipe.sgn \
-certificate CareSoul.cer \
-keytype exchange
# ...
# Signature was verified OK
```
## openssl gost
Установка *openssl* с поддержкой ГОСТ
```bash
# https://gist.github.com/shadz3rg/7badec13e154751116a6446fe9f61906
# Ubuntu 18.04.1 LTS (GNU/Linux 4.15.0-36-generic x86_64)
# --- docker image setup
# apt update
# --- --- passenger-ruby
# apt install libcurl4 libcurl3-gnutls libcurl4-openssl-dev
# --- --- ruby
# apt-get install libcurl4-openssl-dev
sudo apt install cmake libssl-dev
git clone --branch=openssl_1_1_0 https://github.com/gost-engine/engine.git gost-engine/engine
cd gost-engine/engine
cmake .
make
# узнаем нужную директорию, копируем туда
openssl version -e
cp bin/gost.so /usr/lib/x86_64-linux-gnu/engines-1.1
# конфиг
cp /etc/ssl/openssl.cnf /etc/ssl/openssl_custom.cnf
vim /etc/ssl/openssl_custom.cnf
```
```ini
# в начало файла
openssl_conf = openssl_def
# в конец
[openssl_def]
engines = engine_section
[engine_section]
gost = gost_section
[gost_section]
engine_id = gost
dynamic_path = /usr/lib/x86_64-linux-gnu/engines-1.1/gost.so
default_algorithms = ALL
CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
```
```bash
# включаем новый конфиг
export OPENSSL_CONF=/etc/ssl/openssl_custom.cnf
# проверяем, что ГОСТы подтянулись
openssl ciphers|tr ':' '\n'|grep GOST
# GOST2012-GOST8912-GOST8912
# GOST2001-GOST89-GOST89
```
## Хэш и подпись по ГОСТ
[cryptopro](https://github.com/divineforest/cryptopro)
Ruby-обёртка для утилиты командной строки cryptcp от CryptoPro CSP в никсах.
Позволяет легко работать с ЭЦП из ruby.
[crypto_gost3410](https://github.com/vblazhnovgit/crypto_gost3410)
Руби библиотека реализующая ГОСТ 34.10-2012 ECC (Elliptic Curve Cryptography, криптография на эллиптических кривых) подпись и VKO алгоритмы
[Об open-source реализациях хэш-функции ГОСТ Р 34.11-2012](https://habr.com/ru/post/450024/)
[Open-source реализации отечественных криптоГОСТов](https://habr.com/ru/post/273055/)
Вычисление хэш-значения файла по ГОСТ 34.11-2012 (?)
```bash
openssl dgst -md_gost12_512 message.txt
# md_gost12_512(message.txt)= 9d295fa56ebe77b83db37832685ce874c43a5add7afc5f1aaa94ca21b12a12897a48b...
```
## Jacarta
1. Установка драйверов. При установки токена в порт USB драйвера устанавливаются автоматически
2. Установка Единого клиента Jacarta. По [ссылке](https://www.aladdin-rd.ru/catalog/jacarta-client/index) скачиваем, распаковываем и устанавливаем клиент. С помощью него можно поменять пин-код токена по-умолчанию, который прописан в документах, выданных УЦ.
3. Установка Крипто ПРО. По [ссылке](https://www.cryptopro.ru/products/csp/downloads) скачиваем и устанавливаем Крипто ПРО CSP. Для скачивания необходимо зарегистрироваться или зайти в свою учетную запись. После запуска необходимо ввести лицензионный ключ, который приведен в договоре на покупку Крипто ПРО.
4. Установка плагина для Internet Explorer. По [ссылке](https://www.cryptopro.ru/products/cades/downloads) скачиваем и устанавливаем *КриптоПро ЭЦП Browser plug-in 2.0*.
5. Проверка работы. Вставляем токен, запускаем IE и переходим по адресу https://login.sberbank-ast.ru/Login.aspx . В поле "Сертификат" должен отобразиться наш сертификат.