Программное обеспечение предназначено для проверки электронных документов подписанных открепленными электронными цифровыми подписями использующих алгоритмы хеширования ГОСТ Р 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 - путь к файлу закрытого ключа По умолчанию: пусто
CLIENT_TIMEOUT - максимальное время ожидания ответа от удаленного сервера.
По умолчанию: 5 секунд
USER_AGENT - значение заголовка User-Agent для HTTP клиента
По умолчанию: Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko
Сервис можно запустить несколькими способами:
- Из исходных файлов.
В папке с исходным кодом выполните:
go run ./cmd/main.go &
- Превариельно скомпилированного файла.
Скомпилировать файл нужно один раз. Для этого в папке go-gost выполните
go build -o go-gost ./cmd/main.go
В результате выполения данной команды в папке появиться испольняемый файл go-gost
Запустите скомпилированный файл:
./go-gost &
Файл .env должен находиться в той же папке, что и скомпилированный файл
- Как системный сервис в 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
- Из 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
В сервисе реализовано два метода проверки:
- Verify File - проверка с загрузкой файлов на сервер
- 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": "Ошибка загрузки файла документа."
}
}
Для проверки подписи необходимо отправить запрос методом 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
Для проверки подписи необходимо отправить запрос методом 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