Summary: 2019

КриптоПро

Настройка ЭЦП в Ubuntu

Для подключения ЭЦП к какому-либо сайту нам потребуется:

  1. ЭЦП
  2. КриптоПро
  3. "Плагин"
  4. "Расширение" для браузера
  5. "Расширение" для браузера от Контура (для Диадок)

Установка КриптоПро

Скачиваем архив с deb-пакетами x64 с оф. сайта, распаковываем, переходим в директорию со сценариями

# --- Устанавливаем Крипто-Про
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 Распаковываем и устанавливаем

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://diadoc.kontur.ru - будет предложено скачать и установить deb-пакет. Далее необходимо перезагрузиться и при повторном входе наблюдаем наши ЭЦП Вход в диадок

Разработка

Проблема. Для того, чтобы работать с Крипто-ПРО в тестовом режиме, необходимо иметь тестовый сертификат и ключ. Для установки тестового сертификата в систему требуется установка корневого тестового сертификата УЦ. Корневой сертификат имеется, установка проходит корректно, но браузер его не видит при попытке установить в систему тестовый сертификат.

Страница скачивания - 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 (оф. сайт)Установка и настройка КриптоПро в Ubuntu Linux 18.04Как я настраивал новые утилиты по работе с электронной подписью в LinuxСоздание тестового сертификата КриптоПроУстановка сертификатов используя КриптоПРО в LinuxДобавление корневых сертификатов в Ubuntu 18.04Работа с КриптоПро CSPКриптоПро (от АльтЛинукс)

Работаем с токенами

# --- Запускаем 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

Работа с носителями и контейнерами

# список носителей с контейнерами
/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/<архитектура>

).

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

# подпись (присоединенная)
# в результате получим файл 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

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

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 с поддержкой ГОСТ

# 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
# в начало файла
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
# включаем новый конфиг
export OPENSSL_CONF=/etc/ssl/openssl_custom.cnf

# проверяем, что ГОСТы подтянулись
openssl ciphers|tr ':' '\n'|grep GOST
# GOST2012-GOST8912-GOST8912
# GOST2001-GOST89-GOST89

Хэш и подпись по ГОСТ

cryptopro Ruby-обёртка для утилиты командной строки cryptcp от CryptoPro CSP в никсах.
Позволяет легко работать с ЭЦП из ruby.

crypto_gost3410 Руби библиотека реализующая ГОСТ 34.10-2012 ECC (Elliptic Curve Cryptography, криптография на эллиптических кривых) подпись и VKO алгоритмы

Об open-source реализациях хэш-функции ГОСТ Р 34.11-2012

Open-source реализации отечественных криптоГОСТов

Вычисление хэш-значения файла по ГОСТ 34.11-2012 (?)

openssl dgst -md_gost12_512 message.txt
# md_gost12_512(message.txt)= 9d295fa56ebe77b83db37832685ce874c43a5add7afc5f1aaa94ca21b12a12897a48b...

Jacarta

  1. Установка драйверов. При установки токена в порт USB драйвера устанавливаются автоматически
  2. Установка Единого клиента Jacarta. По ссылке скачиваем, распаковываем и устанавливаем клиент. С помощью него можно поменять пин-код токена по-умолчанию, который прописан в документах, выданных УЦ.
  3. Установка Крипто ПРО. По ссылке скачиваем и устанавливаем Крипто ПРО CSP. Для скачивания необходимо зарегистрироваться или зайти в свою учетную запись. После запуска необходимо ввести лицензионный ключ, который приведен в договоре на покупку Крипто ПРО.
  4. Установка плагина для Internet Explorer. По ссылке скачиваем и устанавливаем КриптоПро ЭЦП Browser plug-in 2.0.
  5. Проверка работы. Вставляем токен, запускаем IE и переходим по адресу https://login.sberbank-ast.ru/Login.aspx . В поле "Сертификат" должен отобразиться наш сертификат.