Введение

Недавно мне понадобился консольный клиент для отладки сайта, который закрыт 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 -h
gost-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 он выдает, что вполне приемлемо для повседневных задач.

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

Комментарии (0)