Skip to content

Instantly share code, notes, and snippets.

@phpdude
Last active March 11, 2022 15:55
Show Gist options
  • Save phpdude/47eecbb61fdc2819bd60cd8d0ad725cc to your computer and use it in GitHub Desktop.
Save phpdude/47eecbb61fdc2819bd60cd8d0ad725cc to your computer and use it in GitHub Desktop.
linux curl с поддержкой КРИПТОПРО

Ремарка: все тесты были на Ubuntu Server 14.04, так же все это справедливо для версии openssl >= 1.0.0. Не советую использовать эту сборку curl для всего что угодно, так как она может быть сильно хуже по возможностям стандартной, так как я компилировал утилиту всего с 1 флагом, и соответственно мог упустить уйму важных ее возможностей. Советую использовать ее как доп утилиту в папке проекта или где попало, не советую в продакшен использовать везде где попало, ну или если с головой подходить к флагам компиляции и сделать это хорошо и по настоящему, у меня такой цели не стоит, делаю на скорую руку, просто как рабочее решение.

  1. Устанавливаем openssl

    apt-get install -y openssl

  2. Настраиваем в linux curl программе (не путать с библиотеками языков типа php_curl.so, там уже сами, но принцип тот же) поддержку криптографических движков:

    GOST2001-GOST89-GOST89

    GOST94-GOST89-GOST89

    Для этого в файле /usr/lib/ssl/openssl.cnf в глобальном пространстве (то есть до первой секции - "[..]") добавляем строчки

GOST

openssl_conf = openssl_def [openssl_def] engines = engine_section

[engine_section] gost = gost_section

[gost_section] engine_id = gost default_algorithms = ALL CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet

GOST
```
  1. Проверяем что у нас появилась поддержка ГОСТ движков в openssl.

    root@b2d31954e0e6:# openssl ciphers|tr ':' '\n' | grep GOS

    GOST2001-GOST89-GOST89

    GOST94-GOST89-GOST89

    root@b2d31954e0e6:#

  2. Качаем последнюю версию curl по ссылке https://curl.haxx.se/download.html, в моем случае это было https://curl.haxx.se/download/curl-7.49.1.tar.gz

  3. Качаем куда удобно и распаковываем, я работал в ~

cd ~ curl https://curl.haxx.se/download/curl-7.49.1.tar.gz > curl-7.49.1.tar.gz tar -xzf curl-7.49.1.tar.gz ```

  1. Устанавливаем libssl-dev и утилиту make

    apt-get install libssl-dev make

  2. Пересобираем и компилируем curl с поддержкой локальной версии openssl.

    cd curl-7.49.1/

    ./configure --with-ssl

    make

  3. В результате у нас должна появиться скомпилированая утилита в папке src. Проверяем что все ок. Если при компиляции утилиты произошли ошибки, то прелагаю вам их решить самостоятельно, все есть в гугле.

root@b2d31954e0e6:~/curl-7.49.1# src/curl -V curl 7.49.1 (x86_64-pc-linux-gnu) libcurl/7.49.1 OpenSSL/1.0.1f zlib/1.2.8 Protocols: dict file ftp ftps gopher http https imap imaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP UnixSockets ```

  1. Используем готовую утилиту по своему усмотрению :)

    src/curl https://example.com/ --cacert /cacer-2015.pem

  2. Для конвертации файлакорневого сертификата КРИПТОПРО из формата p7b в нормальный формат PEM подходит вот такая команда

    openssl pkcs7 -inform DER -outform PEM -print_certs -in cert.p7b -out cert.pem

Полезные ссылки:

https://www.altlinux.org/%D0%93%D0%9E%D0%A1%D0%A2_%D0%B2_OpenSSL

@phpdude
Copy link
Author

phpdude commented Jun 10, 2016

В комментариях можете дополнения писать и другие подводные камни, если кому пригодится ))

@djuwa4
Copy link

djuwa4 commented Aug 9, 2021

Парни, может кто-то поможет? Мне нужен доступ к API: https://ssl.croinform.ru:450/api.test. Я запросы делаю curl/ом, пример: curl --connect-to POST https://ssl.croinform.ru:450/api.test?Type=Login&Login=testUser&Password=testPassword. У них пописывается настройка инфраструктуры по windows, а это крипто про + установка сертификатов ssl.croinform.cer, cacer.p7b. Я пробовал через git bash, но мне это показалось более тернистым путем. Решил попробовать на ubuntu, устранил кучу ошибок тем что: настроил госты для openssl, установил по ману автора curl с поддержкой openssl, конвертнул p7b в pem. Пробую такой запрос:
src/curl --connect-to POST https://ssl.croinform.ru:450/api.test?Type=Login&Login=testUser&Password=testPassword --cacert /etc/ssl/certs/ssl.croinform.cer
либо так пробовал --cacert /etc/ssl/certs/cacer.pem

Теперь мучаюсь с новой ошибкой:
curl: (7) Failed to connect to ssl.croinform.ru port 0: Время ожидания соединения истекло

Может есть мысли у кого?

Даже так пробовал вопрос решать:
cat /etc/ssl/certs/ssl.croinform.cer >> cer
cat /etc/ssl/certs/cacer.pem >> cer
--cacert cer
Или так: --cacert /etc/ssl/certs/ssl.croinform.cer /etc/ssl/certs/cacer.pem

Не помогает увы(((

@djuwa4
Copy link

djuwa4 commented Aug 9, 2021

  1. По поводу дополнений, мне помог другой способ госты добавить (у меня это сработало только в ubuntu, не на centos):
    nano /etc/ssl/openssl.cnf
    openssl_conf = openssl_def # Это в начало файла

    #Все что ниже в конец
    [openssl_def]
    engines = engine_section

    [engine_section]
    gost = gost_section

    [gost_section]
    engine_id = gost
    dynamic_path = /usr/lib/ssl/engines/libgost.so
    default_algorithms = ALL
    CRYPT_PARAMS = id-Gost28147-89-CryptoPro-A-ParamSet

Причем у меня путь к файлу /usr/lib/ssl/engines/libgost.so другой, ищите у себя find правильный путь.

  1. При установке curl у меня на ubuntu 16 не работала команда ./configure --with-ssl, проблему решил установкой apt install build-essential (GCC).

  2. Файл сумел конвертнуть только так: openssl pkcs7 -in cacer.p7b -inform DER -print_certs -out cacer.pem

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment