gost-curl — консольный HTTP-клиент с поддержкой ГОСТ TLS 1.3

от автора

Введение

Недавно мне понадобился консольный клиент для отладки сайта, который закрыт TLS 1.3 на ГОСТ-алгоритмах. Из доступных у меня были варианты:

  • curl в составе дистрибутива от известного крипто-провайдера.

  • собрать самому нативный curl из исходников, с openssl + ручной патч ГОСТ TLS 1.3.

Ни тот, ни другой вариант не были удобными для повседневной автоматизации для разных ОС. В итоге я написал на Java урезанный аналог curl, который умеет работать с TLS 1.3 на ГОСТ.

Данный инструмент может быть полезен разработчикам, devops-инженерам, QA и администраторам. gost-curl самодостаточен, не требует установки openssl или каких-то крипто-провайдеров, работает в разных ОС.

Исходные тексты и бинарные файлы для Linux и Macos доступны по ссылке. Для остальных ОС есть jar-файл.

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

gost-curl — предназначен для работы только по TLS 1.3 и только с использованием ГОСТ-алгоритмов. Для всего остального есть нативный curl, доступный в любой ОС.

Поддерживается только алгоритм «Кузнечик», российские OID-кривые и форматы сертификатов, «Магма» не поддерживается.

Важной особенностью инструмента является поддержка PEM/DER/PKCS12 форматов, поэтому пользователям не придется заниматься конвертацией ключей.

Доступные опции:

-> % ./gost-curl -hgost-curl — консольный HTTP-клиент с поддержкой ГОСТ TLS 1.3 v0.1.0. Red Stars Systems 2026.Использование: gost-curl [опции] <url>Опции:  -X, --request <метод>    HTTP-метод (по умолчанию: GET)  -d, --data <тело>        Тело запроса (меняет метод на POST)  -H, --header <Имя:Знч>   Заголовок запроса (можно повторять)  -v, --verbose            Показать заголовки запроса и ответа  -o, --output <файл>      Сохранить ответ в файл (по умолчанию: stdout)  -L, --location           Следовать перенаправлениям (3xx)  -k, --insecure           Отключить проверку сертификата и hostname (только разработка)  -I, --head               Получить только заголовки (HEAD-запрос)  -C, --continue-at <N|->  Докачка: -C - (авто) или -C <оффсет>  -u, --user <user:pass>   Basic-аутентификация (user:pass или запрос пароля)  -x, --proxy <url>        HTTP/SOCKS5-прокси (http://user:pass@host:port)  -r, --range <N-N|N-|-N>  Диапазон байт  -T, --upload-file <ф>    Загрузить файл (PUT)  -F, --form <n=v|n=@ф>    Multipart form-data (можно повторять)      --ca, --cacert <файл>       CA-сертификат(ы) (PEM или DER) для проверки сервера.                                  PEM-файл может содержать цепочку доверенных CA      --cert <файл>[:<пароль>]    Клиентский сертификат для mTLS.                                  PEM — цепочка сертификатов (leaf + промежуточные).                                  PKCS12/PFX — сертификат + ключ. Пароль опционально.      --key <файл>                Закрытый ключ клиента (PEM или DER) для mTLS.                                  Поддерживаются зашифрованные PEM-ключи.      --passin <spec>             Источник пароля для PKCS12 или зашифрованного ключа.                                  Форматы: pass:xxx, file:путь, env:VAR, stdin      --connect-timeout с         Таймаут соединения (по умолчанию: 10)      --read-timeout с            Таймаут чтения (по умолчанию: 30)      --tlsv1.3                   Использовать TLS 1.3 (всегда включён)      --progress-bar              Показать прогресс-бар со скоростью и ETA      --speed-limit <байт/с>      Отмена при скорости ниже лимита      --speed-time <сек>          Время замера скорости (по умолч. 30)      --retry <N>                 Повтор при ошибке до N раз      --retry-delay <сек>         Задержка между повторами (по умолч. 1)      --limit-rate <скорость>     Ограничить скорость (500K, 2M, 1G)      --no-verify-hostname        Отключить проверку совпадения имени хоста (CN/SAN) с сертификатом (по умолчанию включена)  -h, --help               Показать эту справкуПримеры:  gost-curl --ca ca.pem https://gost-server.example/api  gost-curl --ca ca-chain.pem --cert client.pem --key client-key.pem \            https://mtls-server.example/api  gost-curl --cert client.p12:secret https://mtls-server.example/api  gost-curl --cert client.p12 --passin file:pass.txt https://mtls-server.example/api  gost-curl --cert encrypted.pem --key encrypted-key.pem --passin pass:secret \            https://mtls-server.example/api  gost-curl -k -X POST -d '{"key":"value"}' -H "Content-Type: application/json" \            --ca ca.pem https://gost-server.example/api  gost-curl -k -L -o page.html https://gost-server.example/redirect

Не стоит ожидать от клиента большой скорости, т.к. у ГОСТ-алгоритмов нет аппаратного ускорения, какие есть у AES. Но от 30-50 МБ/c он выдает, что вполне приемлемо для повседневных задач.

Лицензия свободная и разрешает использование в любых сферах.

ссылка на оригинал статьи https://habr.com/ru/articles/1048824/