Установка OpenSSL GOST Engine на CentOS 9 для Bitrix VM

Основные возможности GOST-engine

GOST-engine — это модуль для OpenSSL, реализующий поддержку российских криптографических алгоритмов в соответствии с ГОСТ Р 34.10-2012, ГОСТ Р 34.11-2012 и другими стандартами.

  • Поддержка алгоритмов электронной подписи (GOST R 34.10-2001, GOST R 34.10-2012).
  • Реализация хэш-функций (GOST R 34.11-94, GOST R 34.11-2012).
  • Симметричное шифрование (GOST 28147-89, Кузнечик, Магма).
  • Использование ГОСТ-алгоритмов в TLS-соединениях.

Официальная страница GOST-engine на GitHub: GOST-engine на GitHub.

Шаги по установке GOST-engine на CentOS 9

Ниже приведены пошаговые инструкции для установки GOST-engine на CentOS 9.

1. Установка зависимостей

dnf install -y gcc g++ make pkgconf git curl openssl-devel

2. Установка CMake

git clone https://github.com/Kitware/CMake.git CMake
cd CMake
LATEST_TAG=$(curl -s https://api.github.com/repos/Kitware/CMake/releases/latest | grep -oP '"tag_name": "\K[^"]+')
git checkout $LATEST_TAG
./bootstrap --prefix=/usr
make -j$(nproc)
make install
cd ..
cmake --version

3. Проверка версии OpenSSL

Убедитесь, что версия OpenSSL выше 3.0:

openssl version -v

4. Установка GOST-engine

git clone https://github.com/gost-engine/engine.git gost-engine
cd gost-engine/
LATEST_TAG=$(curl -s https://api.github.com/repos/gost-engine/engine/releases/latest | grep -oP '"tag_name": "\K[^"]+')
git checkout $LATEST_TAG
git submodule update --init
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr
cmake --build . --config Release
cmake --build . --target install --config Release

5. Настройка OpenSSL

Измените начало файла /etc/ssl/openssl.cnf:

sed -i 's/openssl_conf = openssl_init/openssl_conf = openssl_def\n#openssl_conf = openssl_init/' /etc/ssl/openssl.cnf

Добавьте в конец файла:

# внизу добавляем
echo "[openssl_def]
engines = engine_section

[engine_section]
gost = gost_section

[gost_section]
engine_id = gost
dynamic_path = /usr/lib64/engines-3/gost.so
default_algorithms = ALL" >> /etc/ssl/openssl.cnf

6. Проверка установки

Проверьте доступные движки:

openssl engine

Проверьте доступные шифры GOST:

openssl engine -c | grep gost | tr -d '[]' | tr ',' '\n'

Генерируем с использованием госта и проверяем

openssl req -x509 -newkey gost2012_256 -pkeyopt paramset:A -nodes -keyout key.pem -out cert.pem -md_gost12_256
openssl x509 -in cert.pem -text -noout

Готово! Теперь GOST-engine установлен и настроен на вашем CentOS 9.

Все вместе файликом
#!/bin/bash

# Цвета для вывода
GREEN='\033[0;32m'
BLUE='\033[0;34m'
RED='\033[0;31m'
NC='\033[0m' # No Color

# Минимальные требуемые версии
MIN_CMAKE_VERSION="3.20.0"
MIN_OPENSSL_VERSION="3.0.0"

# Файл конфигурации OpenSSL
OPENSSL_CONF="/etc/ssl/openssl.cnf"

echo -e "${BLUE}=== Начало установки необходимых компонентов ===${NC}"

# Установка базовых зависимостей
echo -e "${GREEN}Установка зависимостей...${NC}"
dnf install -y \
    gcc \
    g++ \
    make \
    pkgconf \
    git \
    curl \
    openssl-devel

# Установка CMake
echo -e "${GREEN}Установка CMake...${NC}"
if [ -d "CMake" ]; then
    echo -e "${GREEN}Удаление существующего каталога CMake...${NC}"
    rm -rf CMake
fi
git clone https://github.com/Kitware/CMake.git CMake
cd CMake || exit
LATEST_TAG=$(curl -s https://api.github.com/repos/Kitware/CMake/releases/latest | grep -oP '"tag_name": "\K[^"]+')
git checkout "$LATEST_TAG"
./bootstrap --prefix=/usr
make -j$(nproc)
make install
cd ..

# Функция сравнения версий
version_compare() {
    if [[ $1 == $2 ]]; then
        return 0
    fi
    local IFS=.
    local i ver1=($1) ver2=($2)
    for ((i=${#ver1[@]}; i<${#ver2[@]}; i++)); do
        ver1[i]=0
    done
    for ((i=0; i<${#ver1[@]}; i++)); do
        if [[ -z ${ver2[i]} ]]; then
            ver2[i]=0
        fi
        if ((10#${ver1[i]} > 10#${ver2[i]})); then
            return 1
        fi
        if ((10#${ver1[i]} < 10#${ver2[i]})); then
            return 2
        fi
    done
    return 0
}

# Проверка версии CMake
echo -e "${BLUE}Проверка версий:${NC}"
CMAKE_VERSION=$(cmake --version | head -n1 | cut -d" " -f3)
echo -e "Установленная версия CMake: $CMAKE_VERSION"
version_compare "$CMAKE_VERSION" "$MIN_CMAKE_VERSION"
if [ $? -eq 2 ]; then
    echo -e "${RED}Ошибка: Версия CMake ($CMAKE_VERSION) ниже минимально требуемой ($MIN_CMAKE_VERSION)${NC}"
    exit 1
else
    echo -e "${GREEN}Версия CMake соответствует требованиям${NC}"
fi

# Проверка версии OpenSSL
OPENSSL_VERSION=$(openssl version | cut -d" " -f2)
echo -e "Установленная версия OpenSSL: $OPENSSL_VERSION"
version_compare "$OPENSSL_VERSION" "$MIN_OPENSSL_VERSION"
if [ $? -eq 2 ]; then
    echo -e "${RED}Ошибка: Версия OpenSSL ($OPENSSL_VERSION) ниже минимально требуемой ($MIN_OPENSSL_VERSION)${NC}"
    exit 1
else
    echo -e "${GREEN}Версия OpenSSL соответствует требованиям${NC}"
fi

# Установка GOST-engine
echo -e "${GREEN}Установка GOST-engine...${NC}"
if [ -d "gost-engine" ]; then
    echo -e "${GREEN}Удаление существующего каталога gost-engine...${NC}"
    rm -rf gost-engine
fi
git clone https://github.com/gost-engine/engine.git gost-engine
cd gost-engine || exit
LATEST_TAG=$(curl -s https://api.github.com/repos/gost-engine/engine/releases/latest | grep -oP '"tag_name": "\K[^"]+')
git checkout "$LATEST_TAG"
git submodule update --init
if [ -d "build" ]; then
    echo -e "${GREEN}Удаление существующего каталога build...${NC}"
    rm -rf build
fi
mkdir build && cd build || exit
cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr
cmake --build . --config Release
cmake --build . --target install --config Release
cd ../..

# Получение пути к директории engines
ENGINES_DIR=$(openssl version -e | grep ENGINESDIR | cut -d'"' -f2)
GOST_SO_PATH="${ENGINES_DIR}/gost.so"
echo -e "${GREEN}Определен путь к gost.so: $GOST_SO_PATH${NC}"

# Конфигурация OpenSSL
echo -e "${GREEN}Настройка конфигурации OpenSSL...${NC}"

# Проверка наличия изменений в начале файла
if grep -q "openssl_conf = openssl_def" "$OPENSSL_CONF"; then
    echo -e "${GREEN}Начальная конфигурация уже изменена, пропускаем...${NC}"
else
    cp "$OPENSSL_CONF" "${OPENSSL_CONF}_default"
    sed -i 's/openssl_conf = openssl_init/openssl_conf = openssl_def\n#openssl_conf = openssl_init/' "$OPENSSL_CONF"
    echo -e "${GREEN}Начальная конфигурация обновлена${NC}"
fi

# Проверка наличия секции GOST в конце файла
if grep -q "\[openssl_def\]" "$OPENSSL_CONF" && grep -q "gost = gost_section" "$OPENSSL_CONF"; then
    echo -e "${GREEN}Конфигурация GOST уже присутствует, пропускаем...${NC}"
else
    # Добавление конфигурации GOST с динамическим путем
    cat << EOF >> "$OPENSSL_CONF"
[openssl_def]
engines = engine_section

[engine_section]
gost = gost_section

[gost_section]
engine_id = gost
dynamic_path = $GOST_SO_PATH
default_algorithms = ALL
EOF
    echo -e "${GREEN}Конфигурация GOST добавлена${NC}"
fi

# Проверка работы GOST engine
echo -e "${BLUE}Проверка GOST engine:${NC}"
openssl engine | grep gost
echo -e "${BLUE}Поддерживаемые алгоритмы:${NC}"
openssl engine -c | grep gost | tr -d '[]' | tr ',' '\n'

# Создание тестового сертификата
echo -e "${GREEN}Создание тестового сертификата с GOST...${NC}"
openssl req -x509 \
    -newkey gost2012_256 \
    -pkeyopt paramset:A \
    -nodes \
    -keyout key.pem \
    -out cert.pem \
    -md_gost12_256

# Вывод информации о сертификате
echo -e "${BLUE}Информация о сертификате:${NC}"
openssl x509 -in cert.pem -text -noout

echo -e "${BLUE}=== Установка завершена успешно ===${NC}"

Оставить комментарий