Skip to content
/ go-gost Public

Go GOST (Stribog) Signature Verifier REST API Server

License

Notifications You must be signed in to change notification settings

vhar/go-gost

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

About

Go GOST (Stribog) Signature Verifier REST API Server

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages