go-gost

module
v0.0.0-...-8738c73 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 21, 2023 License: MIT

README

REST API сервер для проверки цифровых подписей "Go GOST"

Описание

Программное обеспечение предназначено для проверки электронных документов подписанных открепленными электронными цифровыми подписями использующих алгоритмы хеширования ГОСТ Р 34.11-94, ГОСТ Р 34.11-2012 (256/512 бит).
Основной целью является использование программного обеспечения в составе информационных систем пользователя, в которых предусмотрена загрузка документов подписанных электронной цифровой подписью.
Программное обеспечение может использоваться как для проверки при загрузке электронных документов, так и для отображения информации о подписи непосредственно на страницах информационного ресурса пользователя.

Программа для ЭВМ «Сервис проверки электронной подписи «Go GOST»» внесена в Реестр программ для ЭВМ, регистрационный № 2023683037 от 02.11.2023.

Минимальные требования

На компьютере должен быть установлен Go (Golang) версии не ниже 1.21.
За дополнительной информацией обращайтесь на официальный сайт https://go.dev/

Установка

Склонируйте репозиторий в нужную папку

git clone https://github.com/vhar/go-gost.git

Перейдите в папку go-gost

cd go-gost

Выполните последовательно команды

go mod init go-gost
go mod tidy

Скопируйте файл examples/.env в файл .env

cp ./examples/.env .env

Отредактируйте файл .env в соответсвии с вашими потребностями

Настройка

Настройка сервиса осуществляется установкой необходимых значений переменных окружения в файле .env

APP_ENV - текущее окружение. Влияет на формат и уровень логирования.
По умолчанию: local

Возможные варианты:
local - текстовый формат с уровнем debug
dev - json формат уровня bebug
prod - json формат уровня info

API_KEY По умолчанию: пусто

Ключ авторизации если нужно ограничить доступ к API Стока символов, например GUID. В случае использования данной переменной, в запросах необходимо передавать заголовок Authorization содержащий данный ключ По умолчанию: пусто, доступ без ограничений

APP_LOG_FILE - полный путь к лог-файлу приложения
По умолчанию: пусто

Если имя файла не указано, логирование осуществляется в стандартный поток STDOUT (syslog)

SERVER_BIND_ADDR - адрес и порт, на котором будет запущен сервер По умолчанию: :8080 (сервер запускается на всех доступных адресах)

SERVER_TIMEOUT - максимальная продолжительность чтения запроса, включая тело.
По умолчанию: 5 секунд

Нулевое или отрицательное значение означает отсутствие таймаута

SERVER_IDDLE - максимальное ожидание следующего запороса для поддержания активного соединения. По умолчанию: 30 секунд

Если равно нулю, но используется значение из SERVER_TIMEOUT.

SERVER_SSL_ENABLE - использовать SSL соединение
По умолчанию: false

true - запустить сервер с использованием протокола HTTPS false - запустить сервер с использованием протокола HTTP Если значение SERVER_SSL_ENABLE = true, необходимо указать полные пути до файлов сертификатов

SERVER_SSL_CHAIN - путь к файлу с цепочкой сертификатов По умолчанию: пусто

Необходимо указать путь к файлу с полной цепочкой сертификатов, начиная от сертификата сайта, заканчивая сертификатом удостоверяющего центра

SERVER_SSL_KEY - путь к файлу закрытого ключа По умолчанию: пусто

Настроки HTTP клиента для проверки файлов на удаленных серверах

CLIENT_TIMEOUT - максимальное время ожидания ответа от удаленного сервера.
По умолчанию: 5 секунд

USER_AGENT - значение заголовка User-Agent для HTTP клиента
По умолчанию: Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko

Запуск сервиса

Сервис можно запустить несколькими способами:

  1. Из исходных файлов.
    В папке с исходным кодом выполните:
go run ./cmd/main.go &
  1. Превариельно скомпилированного файла.
    Скомпилировать файл нужно один раз. Для этого в папке go-gost выполните
go build -o go-gost ./cmd/main.go

В результате выполения данной команды в папке появиться испольняемый файл go-gost
Запустите скомпилированный файл:

./go-gost &

Файл .env должен находиться в той же папке, что и скомпилированный файл

  1. Как системный сервис в Linux.
    Для использования этого способа нужно предварительно скоипилировать испольняемый файл.
    Выполните в папке go-gost:
go build -o go-gost ./cmd/main.go

Создайте папку /opt/go-gost и скопируйте в нее созданный исполняемый файл и файл .env

sudo mkdir /opt/go-gost && sudo cp ./go-gost /opt/go-gost && sudo cp ./.env /opt/go-gost

Скопируйте файл examples/go-gost.service в папку /lib/systemd/system

sudo cp ./examples/go-gost.service /lib/systemd/system/go-gost.service

Теперь можно запускать и останавливать сервис как и любые другие системные сервисы.
Для запуска выполнить:

sudo systemctl start go-gost

Для остановки выполнить:

sudo systemctl stop go-gost

Посмотреть состояние:

sudo systemctl status go-gost

Также, можно поставить сервис в автозагрузку

sudo systemctl enable go-gost

Убрать сервис из автозагрузки:

sudo systemctl disable go-gost
  1. Из Docker контейнера. При использования данного способа, скачивать исходные коды и компилировать исполняемый файл не нужно, просто создайте файл .env как описано выше.
    Скачатйе контейнер выполнив команду:
docker pull vhar/go-gost-alt

Для запуска сервиса в контейнере, выполните команду:

docker run -d -p 80:8080 --env-file .env vhar/go-gost-alt

Замените порты 80:8080 на ваши значение и в опции --env-file укажите полный путь к вашему файлу .env

Использование сервиса

В сервисе реализовано два метода проверки:

  1. Verify File - проверка с загрузкой файлов на сервер
  2. Verify URL - проверка файлов расположенных на удаленном сервере

Оба метода возвращают одинаковую JSON структуру отчета payload в случае успеха или структуру ошибки error содержащую поля message с описанием ошибки и code c HTTP кодом ошибки.

Пример отчета:

{
    "payload":{
        "Signer": {
            "CommonName": "АО \"РОГА И КОПЫТА\"",
            "CountryName": "RU",
            "StateOrProvinceName": "64 Саратовская область",
            "LocalityName": "Арбатов",
            "Surname": "Паниковский",
            "GivenName": "Михаил Самуэльевич",
            "Title": "Уполномоченный по рогам",
            "EmailAddress": "misha@panikovsky.gov"
        },
        "Certificate": {
            "IssuerName": "УЦ Федерального казначейства",
            "NotBefore": "03.02.2015 08:26",
            "NotAfter": "03.05.2016 08:26",
            "EncriptionAlgorithm": "ГОСТ Р 34.11/34.10-2001",
            "DigestAlgorithm": "ГОСТ Р 34.11-94"
        },
        "SigningTime": "09.22.2016 09:50:00 UTC",
        "Validity": false
    }
}

Поле Validity возвращает true в случае если файл подписи был создан для переданного документа и последний после этого не модифицировался.

Пример ошибки

{
    "error":{
        "code": 422,
        "message": "Ошибка загрузки файла документа."
    }
}

Использование метода Verify File

Для проверки подписи необходимо отправить запрос методом HTTP POST на URN /vfile
Заголовки: Content-Type: multipart/form-data
Authorization: API_KEY

Заголовок Authorization передается если задана переменная окружения API_KEY

В теле запроса необходимо передать проверяемый документ в поле document и файл подписи в поле signature

<form method="post" action="/vfile" enctype="multipart/form-data">
  <input type="file" name="document" />
  <input type="file" name="signature" />
</form>

Пример использования метода можно посмотреть в файле examples/vfile.html

Использование метода Verify URL

Для проверки подписи необходимо отправить запрос методом HTTP POST на URN /vurl
Заголовки:
Content-Type: application/json
Authorization: API_KEY

Заголовок Authorization передается если задана переменная окружения API_KEY

В теле запроса в поле document указать URL на проверяемый документ и в поле signature URL на файл с проверяемой подписью.
Дополнительно в теле запроса можно передать поле referer если сервер, на котором расположены проверяемые файлы не позволяет обращаться у ним напрямую.

{
  "document": "https://example.com/1b96db2c7e458802a4dd404d71f1c14d_166.pdf",
  "signature": "https://example.com/1b96db2c7e458802a4dd404d71f1c14d_166.pdf.sig",
  "referer": "https://mydomain.org"
}

Пример использования метода можно посмотреть в файле examples/vurl.html

Directories

Path Synopsis
internal

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL