Развертывание платформы в частной сети при использовании ГОСТ криптографии с PKI

Если вы планируете использовать ГОСТ криптографию с PKI, следуйте описанному ниже порядку создания аккаунтов нод, настройки TLS, подписания genesis-блока и ****** .

Создание аккаунта ноды c использованием ГОСТ криптографии с PKI

Создайте аккаунты для каждой ноды вашей будущей сети.

Аккаунт ноды включает в себя адрес, ключевую пару и сертификат X.509. Адрес, ключевая пара (публичный и приватный ключи ноды) и запрос на сертификат создаются при помощи утилиты GeneratePkiKeypair, которая входит в пакет generators. Этот пакет входит в состав сертифицированной версии Платформы «Waves Enterprise» и поставляется вместе с ней.

Важно

Исключена возможность генерации ключевых пар по удаленному подключению к ноде.

Примечание

При использовании ГОСТ криптографии генерация аккаунта ноды возможна только при наличии графического интерфейса в операционной системе и предварительно установленных компонент СКЗИ «КриптоПро CSP».

Ключ ЭП и закрытые ключи TLS ноды ?????????ссылка на стр ТЛС для PKI????????? записываются в хранилище ключей СКЗИ «КриптоПро CSP», которое размещается на жестком диске ноды. Хранилище ключей (keystore) в этом случае расположено в директории, которая по умолчанию находится в директории /var/opt/cprocsp/keys/root/{username} в UNIX-подобных системах (Linux, OSX), где username — имя пользователя, под которым запускался генератор.

Для создания ключей электронной подписи и соответствующих им ключей проверки электронной подписи используется алгоритм JCP.GOST_EL_2012_256_NAME.

Чтобы создать аккаунт узла, запустите утилиту GeneratePkiKeypair.

Утилита выполняет следующие действия:

  • отображает в командной строке адрес и публичный ключ узла;

  • записывает приватный ключ узла в контейнер в хранилище ключей;

при создании пары ключей необходимо задать пароль для защиты ключевой пары узла:

  • при работе на ОС CentOS отобразится диалоговое окно, в котором необходимо задать пароль к контейнеру;

  • при работе на ОС Linux пароль запрашивается через консоль;

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

  • выгружает запрос на сертификат в указанную директорию; запрос на сертификат содержит ранее сгенерированный публичный ключ и информацию, полученную из конфигурационного файла; в дальнейшем этот запрос необходимо самостоятельно отправить в удостоверяющий центр (УЦ) для получения сертификата;

  • выводит лог, в конце которого отображается имя контейнера, в котором хранится приватный ключ, и алиас (адрес) публичного ключа.

После того как вы отправили в УЦ запрос и получили из УЦ сертификат, его необходимо вручную импортировать в контейнер с ключевой парой в хранилище ключей, как описано ниже в разделе «Импорт сертификата».

Примечание

Утилита GeneratePkiKeypair также используется для создания ключей для TLS. За один запуск генератор создаёт одну ключевую пару.

Удостоверяющий центр

Для подтверждения подлинности ключей шифрования Платформа использует сертификаты, выданные удостоверяющим центром (центром сертификации, УЦ). Для работы с УЦ необходимо выполнить следующие шаги:

  1. Выберите УЦ, с которым будете работать.

  2. Скачайте корневой сертификат УЦ с сайта УЦ.

  3. Поместите корневой сертификат УЦ в хранилище сертификатов в директории ноды: /node/certificates.

  4. Помимо этого, для создания genesis-блока необходимо добавить корневой сертификат в хранилище доверенных сертификатов JVM как описано ниже в разделе «Подготовка к запуску генератора GenesisBlockGenerator».

После этого узел будет считать достоверными сертификаты, подписанные этим УЦ.

GeneratePkiKeypair

Используйте утилиту GeneratePkiKeypair для создания ключевой пары узла и подписанного этой ключевой парой запроса на сертификат (CSR – Certificate Signing Request) стандарта X.509.

Для генерации ключевой пары утилита использует средства КриптоПро (КриптоПро CSP, включая КриптоПро JCSP).

Созданная ключевая пара сохраняется в хранилище ключей (keystore): приватный ключ записывается сразу после генерации, публичный – вместе с полученным от УЦ сертификатом.

Утилита GeneratePkiKeypair заполняет поля в созданном запросе на сертификат из полученного ей на вход файла с конфигурацией.

Примечание

Утилита GeneratePkiKeypair также используется для создания ключей для TLS. За один запуск генератор создаёт одну ключевую пару.

Конфигурационный файл для GeneratePkiKeypair

До запуска генератора необходимо подготовить конфигурационный файл в формате HOCON pki-keypair-generator.conf с данными для запроса на сертификат. Ниже приведён пример этого файла:

pki-key-pair-generator {
    crypto-type = gost
    chain-id = T
    key-pair-algorithm = "GOST_EL_2012_256" # or GOST_DH_2012_256
    keystore-password = "avada-kedavra"
    out-dir = "/Users/dummy/cert_requests" # optional: execution dir if not set
    cert-request-content {
        CN = "Node-0"
        O = "Waves Enterprise"
        OU = "IT Business"
        C = "RU"
        S = "Moscow"
        L = "Moscow"
        extensions {
            key-usage = ["digitalSignature"]
            extended-key-usage = ["clientAuth"] # or ["serverAuth"]
            subject-alternative-name = "DNS:welocal.dev,DNS:localhost,IP:51.210.211.61,IP:127.0.0.1"
        }
    }
}

Заполните поля конфигурационного файла:

  • crypto-type — тип криптографии; поддерживается только значение gost;

  • chain-id — идентифицирующий байт сети; допустимо передать только один символ без кавычек либо в двойных кавычках: латинскую букву (строчную или прописную), либо цифру; значение должно совпадать с параметром blockchain.custom.address-scheme-character из конфигурационного файла узла;

  • key-pair-algorithm — алгоритм генерации ключевой пары; допустимые значения:

    • GOST_EL_2012_256 — для ключей ЭП (ключей узла); в этом случае в поле extensions.key-usage должно быть указано значение digitalSignature;

    • GOST_DH_2012_256 — для ключевых пар, которые участвуют в процессе шифрования данных (ключи для TLS); в этом случае в поле extensions.key-usage должно быть указано значение keyEncipherment или dataEncipherment;

  • keystore-password — пароль хранилища ключей (keystore); этот же пароль потребуется в дальнейшем:

    • он должен быть указан в конфигурационном файле узла в разделе wallet в параметре password;

    • при использовании PKI этот же пароль используется при подписании genesis-, когда в консоли выводится запрос ввода пароля хранилища ключей (сообщение «enter keystore password»);

  • out-dir — директория, в которую будет выгружен запрос на сертификат; опциональное поле; если значение не указано, то запрос выгружается в директорию, из которой запускался генератор;

  • cert-request-content — поля с информацией для создания запроса на сертификат:

    • CN — общее имя узла;

    • O — организация;

    • OU — подразделение;

    • C — страна;

    • S — штат или провинция;

    • L — наименование населенного пункта;

    • extensions

      • key-usage — допускаются следующие значения, указывающие на назначение ключа:

        • digitalSignature — укажите это значение для ключей ЭП (ключей узла); в этом случае используется алгоритм шифрования GOST_EL_2012_256,

        • keyEncipherment — укажите это значение при генерации ключей для TLS; в этом случае используется алгоритм шифрования GOST_DH_2012_256,

        • dataEncipherment — укажите это значение при генерации ключей для TLS; в этом случае используется алгоритм шифрования GOST_DH_2012_256.

      • extended-key-usage — массив дополнительных значений типа enum, указывающих на назначение ключа; опциональное поле; допустимые значения:

        • ServerAuth,

        • ClientAuth,

        • CodeSigning,

        • EmailProtection,

        • TimeStamping,

        • OCSPSigning.

      Кроме этих значений допустимы значения в формате строки из чисел, разделённых точками, например: «1.2.3.4».

      • subject-alternative-name — альтернативное имя субъекта; используется в основном для TLS для сверки хостнеймов; опциональное поле.

Запуск GeneratePkiKeypair

Скопируйте в директорию узла файл generators.jar. После этого утилиту GeneratePkiKeypair можно запустить из командной строки. В качестве аргумента утилите необходимо передать один параметр: путь до файла с конфигурацией:

java -cp "generators-1.9.0-M1-38-d823c7f.jar:gostCrypto-5.0.42119-A/*" com.wavesenterprise.generator.pki.PkiKeyPairGenerator pki-keypair-generator.conf

В процессе работы генератор запрашивает пароль ключевой пары; пример сообщения: «Enter key entry „3MrfnwhPPmvJp5B4hiwUwqtSJBJGs9DuxWe“ new password:». Введите и подтвердите пароль. Этот же пароль потребуется в дальнейшем:

  • при использовании PKI – при подписании genesis-блока, когда в консоли выводится запрос ввода пароля ключевой пары (сообщение «enter keypair password»);

  • в файле env в поле WE_NODE_OWNER_PASSWORD ноды необходимо указать этот же пароль:

    WE_NODE_OWNER_PASSWORD=console # пароль из enter keypair password
    WE_NODE_OWNER_PASSWORD_EMPTY=false
    

В процессе работы утилита выводит сообщения об успешности создания ключевой пары и запроса на сертификат, например:

2022-03-28 11:37:56,369 INFO [ioapp-compute-0] c.w.g.p.PkiKeyPairGenerator$ - Key pair successfully saved
2022-03-28 11:37:56,370 INFO [ioapp-compute-0] c.w.g.p.PkiKeyPairGenerator$ - Generating certificate request
2022-03-28 11:37:56,375 INFO [ioapp-compute-0] c.w.g.p.PkiKeyPairGenerator$ - Certificate request generated
2022-03-28 11:37:56,380 INFO [ioapp-compute-0] c.w.g.p.PkiKeyPairGenerator$ - Certificate request successfully exported to
 '/Users/username/Documents/VSCodeProjects/waves-enterprise/generator/jars/requests/3NAjk7wnh6VfE6esY9s94FGE1Z5QFDvPB3S.req'
2022-03-28 11:37:56,383 INFO [ioapp-compute-0] c.w.g.p.PkiKeyPairGenerator$ - Generated keypair:
Public key: 5GZrzce48Jv48Lq8Hn8PTqFDA1Yg2wWkAww1VXSonATfSub4mwo3YPymvqjkKYszxj4f794GqySz4deAZayroNnA
Alias (address for chain-id 'T'): 3NAjk7wnh6VfE6esY9s94FGE1Z5QFDvPB3S

Результат работы GeneratePkiKeypair

В результате работы генератор GeneratePkiKeypair

  • выводит в командной строке

  • блокчейн адрес (алиас) узла,

  • публичный ключ узла в кодировке Base58,

  • имя контейнера (в конце лога генератора); оно потребуется для дальнейшей настройки.

  • записывает приватный ключ узла в контейнер в хранилище ключей; адрес хранилища ключей задаётся в конфигурационном файле узла в разделе wallet в параметре file;

  • выгружает запрос на сертификат (CSR) в указанную в конфигурационном файле pki-keypair-generator.conf директорию; запрос на сертификат содержит ранее сгенерированный публичный ключ и информацию, полученную из конфигурационного файла.

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

Далее необходимо получить в удостоверяющем центре (УЦ) сертификат и импортировать его в контейнер с соответствующей парой ключей. Для этого выполните следующие шаги:

  1. Конвертируйте запрос на сертификат, полученный в результате работы генератора, в формат base64. Ниже приведён пример команды конвертации:

base64 ./jars/requests/3N5YTeLzpH18qrGRTVdL11DPkRPnM32aNVH.req
  1. Отправьте запрос в формате base64 в УЦ и скачайте из УЦ сертификат.

  2. Конвертируйте этот сертификат в формат base64.

  3. Импортируйте сертификат в контейнер с соответствующей парой ключей в хранилище ключей. Для GOST_EL_2012_256 используйте команду -keytype signature, для GOST_DH_2012_256 – команду -keytype exchange. Ниже приведён пример команды импорта:

/opt/cprocsp/bin/csptest -keyset -container 3MuuyL9pCsGeQNBnX14NuzRwGxSK3uzQW86 -keytype signature -impcert 3MuuyL9pCsGeQNBnX14NuzRwGxSK3uzQW86.cer

В этом примере:

  • 3MuuyL9pCsGeQNBnX14NuzRwGxSK3uzQW86 – имя контейнера, которое указано в конце лога генератора,

  • 3MuuyL9pCsGeQNBnX14NuzRwGxSK3uzQW86.cer – полученный из УЦ файл сертификата.

  1. Помимо этого, необходимо добавить сертификат в секцию node.blockchain.custom.genesis.pki конфигурационного файла узла для создания genesis-блока как описано ниже в разделе «Подготовка к запуску генератора GenesisBlockGenerator».

Настройка платформы для работы в частной сети при использовании ГОСТ криптографии с PKI

Для конфигурации платформы для работы в частной сети при использовании ГОСТ криптографии с PKI необходимо выполнить те же шаги общей и тонкой настройки, что и при использовании Waves криптографии или ГОСТ криптографии без PKI.

Получение лицензии для работы в частной сети

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

Примечание

Opensource-версия блокчейн-платформы Waves Enterprise не требует лицензии.

Лицензия для запуска ноды привязана к ключу владельца ноды. В самой лицензии прописан адрес ноды, для которого лицензия выпущена.

Для обсуждения деталей вашей лицензии свяжитесь с отделом продаж Waves Enterprise по электронной почте: sales@wavesenterprise.com.

По результатам обсуждения вам будет прислан файл лицензии. Поместите этот файл в папку, путь к которой указан в параметре license-file конфигурационного файла ноды.

Перед развертыванием ознакомьтесь с системными требованиями к блокчейн-платформе.

Подписание genesis-блока и запуск сети

После выполнения конфигурации нод вашей сети необходимо создать genesis-блок – первый блок приватного блокчейна, содержащий транзакции, определяющие первоначальный баланс и разрешения ноды.

Genesis-блок подписывается утилитой GenesisBlockGenerator, входящей в пакет generators. В качестве аргумента она использует настроенный вами конфигурационный файл ноды node.conf:

java -jar generators-x.x.x.jar GenesisBlockGenerator node.conf

В результате работы утилиты поля genesis-public-key-base-58 и signature, находящиеся в блоке genesis секции blockchain конфигурационного файла ноды, будут заполнены сгенерированными значениями открытого ключа и подписи genesis-блока.

Пример:

genesis-public-key-base-58: "4ozcAj...penxrm"
signature: "5QNVGF...7Bj4Pc"

Примечание

При использовании ГОСТ PKI криптографии необходимо, чтобы до подписания genesis-блока были установлены компоненты CryptoPro. Также перед запуском генератора GenesisBlockGenerator необходимо подготовить конфигурационный файл ноды:

  • задать параметру node.crypto.type значение gost;

  • задать параметру node.crypto.pki.mode одно из следующих значений: on или test;

  • добавить публичный ключ, которым будет подписываться genesis-блок, в секцию network-participants и там же присвоить ему роль permissioner; публичный ключ, которым будет подписываться genesis-блок, также создается генератором GeneratePkiKeypair. Ключ должен находиться локально в хранилище ключей машины, с которой запускается генератор.

  • добавить в конфигурационный файл идентификаторы корневых доверенных сертификатов – в качестве идентификаторов используются отпечатки (fingerprint) сертификатов в SHA-1; указать сертификаты участников сети в формате DER, закодированные при помощи Base64 в текст; для этого в разделе node.blockchain.custom.genesis.pki необходимо задать следующие параметры:

    • trusted-root-fingerprints – массив Base64 строк, перечисляющих SHA-1 отпечатков доверенных корневых сертификатов, которые должны находиться в trust-store JVM,

    • certificates – массив строк в формате Base64, содержащих тела сертификатов в бинарной кодировке DER.

Также необходимо сконфигурировать среду запуска генератора GenesisBlockGenerator:

  • добавить в хранилище доверенных сертификатов (trust-store) JVM корневые сертификаты, которые будут использоваться в качестве доверенных при валидации цепочек в блокчейн сети. Для этого можно использовать встроенную в JVM утилиту keystore. Пример вызова утилиты:

keytool -import -trustcacerts -alias %CERT_ALIAS% -noprompt -storepass 'changeit' -keystore %PATH_TO_YOUR_JRE%/lib/security/cacerts -file cert-to-add.cer

После этого запустите GenesisBlockGenerator в командной строке, указав путь до конфигурационного файла ноды, который требуется подписать, и алиас (адрес) ключа, которым будет подписываться genesis-блок. Например:

java -cp "generators-x.x.x.jar::./java-csp-5.0.R2/*" com.wavesenterprise.generator.GeneratorLauncher GenesisBlockGenerator ./node_alone.conf 3N1uZiamcpuTnRASi7L17vM8xhbC292UNgU

После подписания genesis-блока платформа полностью настроена и готова для запуска сети. Вы можете запустить ее согласно указаниям, полученным от специалистов Waves Enterprise.