gemlog/public/uk/gostcoin-on-fedora-with-native-openssl.gmi
2026-01-28 22:30:01 +02:00

183 lines
No EOL
9.5 KiB
Text
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Особливості збірки GOSTcoin на Fedora 43
> Я вгепав у це питання близько тижня і вже тричі переписував даний матеріал. Утім, я досі не запустив старий гаманець GOSTCoin, але назбирав купу нотаток і нового досвіду.
Прочитавши допис @acetone "GOSTCoin - первая криптовалюта в I2P" поставив собі цей гаманець на Debian 13: все працювало згідно інструкцій README. Але згодом, перебої зі світлом перегнали мене на іншу машину вже на базі Fedora 43, де запуск гаманця з підсунутим файлом ~/.gostcoin/wallet.dat - вилітав з помилкою:
> error loading wallet.dat: wallet corrupted
Переглянувши журнал, знайшов там:
``` ~/.gostcoin/debug.log
Error reading wallet database: CPrivKey corrupt
```
Створив відповідний репорт і отримав вичерпну вичерпну пораду збирати OpenSSL "під себе"
=> https://github.com/GOSTSec/gostcoin/issues/65
Я мало знайомий з нутрощами OpenSSL, але оскільки GOSTcoin - єдина відома мені валюта з альтернативним алгоритмом over SAM, вирішив заморочитись. З того що вияснив, OpenSSL v3 (як і Fedora) з коробки постачається тільки з "надійними" алгоритмами криптографії, все інше - застаріле, сумнівне та користувацьке - виведено на рівень модулів "engines" і "providers".
Більше того, починаючи з Fedora 43, функціональність "engines" вважається застарілою:
=> https://discussion.fedoraproject.org/t/f43-change-proposal-disabling-support-of-building-openssl-engines-system-wide Fedora 43: Disabling support of building OpenSSL engines
Тому на перспективу лишиться тільки "providers", API яких ще не всюди підтримується. GOSTcoin - тут не виключення: наприклад, інтерфейс `EC_GROUP*` - не бачитиме криптографічних кривих провайдерів і схоже потребуватиме додаткового патчу або ж компіляції якоїсь старої версії OpenSSL... Стару версію я не хочу, бо й так завжди можу підняти старий Debian на віртуалці; мені цікаво саме актуалізуватись.
## gost-engine
=> https://github.com/gost-engine/engine
Цей проєкт реалізує "engine" і "provider", тому він буде потрібен в не залежності від того, яким шляхом ви підете. Є два варіанти його встановлення:
### Репозиторій Fedora
=> https://src.fedoraproject.org/rpms/openssl-gost-engine
Чомусь інсталяція не містить в собі деяких алгоритмів при оновленні політики (про що згодом)
``` bash
sudo dnf install openssl-gost-engine
```
### Збірка з початкового коду
=> https://github.com/gost-engine/engine/blob/master/INSTALL.md
Щоб уникнути проблеми зі знаходженням <openssl/engine.h> на Fedora, потрібно додати пакунок:
``` bash
sudo dnf install openssl-devel-engine
```
=> https://github.com/gost-engine/engine/pull/511 вже додав цю нотатку до README
``` bash
git clone https://github.com/gost-engine/engine
cd engine
git submodule update --init
mkdir build
cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
cmake --build . --config Release
sudo cmake --build . --target install --config Release
```
* або `sudo make install`
### Підключення engine
``` /etc/ssl/openssl.cnf
[openssl_init]
engines = engine_section
[engine_section]
gost = gost_section
[gost_section]
engine_id = gost
dynamic_path = /usr/lib64/engines-3/gost.so
default_algorithms = ALL
# ще не впевнений, чи ці параметри дійсно потрібні і є правильними
# CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet
# activate = 1
```
* шлях `dynamic_path` можна визначити командою `openssl version -e`
### Підключення provider
``` /etc/ssl/openssl.cnf
[provider_sect]
default = default_sect
gost = gost_sect
[gost_sect]
module = /usr/lib64/ossl-modules/gostprov.so
activate = 1
```
* шлях `module` можна визначити командою `openssl info -modulesdir`
### Оновлення політики
Стандартною політикою на Fedora 43 є `DEFAULT`. Тому для використання сертифікатів GOST, її потрібно знизити до `LEGACY`:
``` bash
sudo update-crypto-policies --set LEGACY
```
Дана команда змінить рядки у файлі /etc/crypto-policies/back-ends/openssl.config:
* `CipherString` - `SECLEVEL` буде переключено з `2` на `1` і додано `aGOST:aGOST01:kGOST:GOST94:GOST89MAC`
* `Groups` - додано `gost2012_256:gost2012_512`
* `rh-allow-sha1-signatures` буде встановлено як `yes`
Напряму файл `openssl.config` редагувати не варто, бо його рано чи пізно буде перезаписано системою: при оновленні кешу або використанні утиліти вище.
### Тестування
``` bash
$ openssl engine
(dynamic) Dynamic engine loading support
(gost) Reference implementation of GOST engine
$ openssl engine gost -t -c
(gost) Reference implementation of GOST engine
[gost89, gost89-cnt, gost89-cnt-12, gost89-cbc, kuznyechik-ecb, kuznyechik-cbc, kuznyechik-cfb, kuznyechik-ofb, kuznyechik-ctr, magma-ecb, kuznyechik-mgm, magma-cbc, magma-ctr, magma-ctr-acpkm, magma-ctr-acpkm-omac, magma-mgm, kuznyechik-ctr-acpkm, kuznyechik-ctr-acpkm-omac, magma-kexp15, kuznyechik-kexp15, md_gost94, gost-mac, md_gost12_256, md_gost12_512, gost-mac-12, magma-mac, kuznyechik-mac, kuznyechik-ctr-acpkm-omac, magma-ctr-acpkm-omac, gost2001, id-GostR3410-2001DH, gost-mac, gost2012_256, gost2012_512, gost-mac-12, magma-mac, kuznyechik-mac, magma-ctr-acpkm-omac, kuznyechik-ctr-acpkm-omac]
[ available ]
openssl ciphers|tr ':' '\n' | grep GOST
GOST2012-MAGMA-MAGMAOMAC
GOST2012-KUZNYECHIK-KUZNYECHIKOMAC
LEGACY-GOST2012-GOST8912-GOST8912
IANA-GOST2012-GOST8912-GOST8912
GOST2001-GOST89-GOST89
$ openssl list -public-key-algorithms | grep GOST
IDs: { 1.2.643.2.2.19, GOST R 34.10-2001, gost2001 } @ gost
IDs: { 1.2.643.2.2.98, GOST R 34.10-2001 DH, id-GostR3410-2001DH } @ gost
IDs: { 1.2.643.7.1.1.1.1, GOST R 34.10-2012 with 256 bit modulus, gost2012_256 } @ gost
IDs: { 1.2.643.7.1.1.1.2, GOST R 34.10-2012 with 512 bit modulus, gost2012_512 } @ gost
$ openssl ecparam -list_curves | grep -i GOST
```
Саме цікаве, що остання команда з `ecparam` - нічого не виводить і все тому, що (як зрозумів) тут ми використовуємо не вбудовані алгоритми а саме API "engine" та "provider".
Далі я опишу збірку гаманця і планую доповнити матеріал згодом, коли натягну це діло ймовірно вже на форк з підтримкою провайдерів, а не допотопної версії OpenSSL.
## GOSTcoin
Тут все згідно інструкції в README:
``` bash
git clone https://github.com/GOSTSec/gostcoin.git
cd gostcoin
/usr/lib64/qt5/bin/qmake "USE_QRCODE=1"
make
```
* `/usr/lib64/qt5/bin/qmake` - тому що в мене система чомусь не бачить `qmake`
* `USE_QRCODE=1` - опціонально, якщо потрібна функціональність QR-кодів
Якщо використовується власна збірка OpenSSL в `/opt/openssl`, шлях до неї вказується так:
``` bash
git clone https://github.com/GOSTSec/gostcoin.git
cd gostcoin
/usr/lib64/qt5/bin/qmake \
"USE_QRCODE=1" \
"INCLUDEPATH += /opt/openssl/include" \
"LIBS += -L/opt/openssl/lib64 -lssl -lcrypto" \
"QMAKE_LFLAGS += -Wl,-rpath,/opt/openssl/lib64"
make
```
В корені буде створено бінарник `gostcoin-qt` який запускаємо після i2pd.
## Посилання
=> https://github.com/gost-engine/engine/discussions/479#discussioncomment-13296401 Порада збирати OpenSSL v1.1 разом з GOST engine (LEGACY)
=> https://github.com/gost-engine/engine/issues/362 Openssl 3 + Gost Engine
#362
=> https://github.com/majek/openssl/blob/master/engines/ccgost/README.gost
=> https://devel.fedoraproject.narkive.com/jls58kln/fedora-dnssec-and-gost-ecc-like-algorithms-with-openssl
=> https://github.com/gost-engine/engine/blob/master/INSTALL.md
=> https://www.reddit.com/r/OPNsenseFirewall/comments/126cmk4/question_how_can_i_install_gost_encryption/
=> https://discussion.fedoraproject.org/t/strong-crypto-settings-how-best-to-define-apply/22600
=> https://github.com/gost-engine/engine/discussions/478