Как скомпилировать Curl с устаревшей поддержкой SSL в Ubuntu?

У меня возникает следующая ошибка при попытке подключиться к старому веб-сайту с поддержкой HTTPS с помощью Curl:

curl https://10.11.1.44
curl: (35) error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol

Более подробно:

* Expire in 0 ms for 6 (transfer 0x55a4192abdd0)
*   Trying 10.11.1.44...
* TCP_NODELAY set
* Expire in 200 ms for 4 (transfer 0x55a4192abdd0)
* Connected to 10.11.1.44 (10.11.1.44) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (OUT), TLS alert, protocol version (582):
* error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol
* Closing connection 0
curl: (35) error:1425F102:SSL routines:ssl_choose_client_version:unsupported protocol

Если я попытаюсь использовать параметры --ssl2 или --ssl3, я получу следующую ошибку:

root@kali:~# curl https://10.11.1.44/ --sslv2
curl: (4) OpenSSL was built without SSLv2 support
root@kali:~# curl https://10.11.1.44/ --sslv3
curl: (4) OpenSSL was built without SSLv3 support

Я ознакомился со следующей страницей, чтобы узнать, как собрать Curl с поддержкой SSL2/3, но не знаю, как его включить?

https://curl.haxx.se/docs/install.html

Любые идеи?


person Shuzheng    schedule 30.05.2019    source источник
comment
разумным решением здесь было бы обновить сервер 10.11.1.44 для поддержки TLS, а не понижать версию curl для поддержки SSL, вы должны сделать это вместо этого, если это возможно. тем не менее, если это невозможно, прочитайте мой ответ ниже (мое личное оправдание для этого заключается в том, что невозможно перепроектировать прошивку Dell DRAC, чтобы заменить веб-сервер DRAC на древний сервер x.x)   -  person hanshenrik    schedule 31.05.2019


Ответы (2)


Обновление: curl прекратил поддержку --sslv2 / sslv3 через некоторое время после версии curl 7.76.1. был выпущен, поэтому вы также должны скомпилировать curl версии 7.76.1 или старше. Инструкции были обновлены, чтобы обеспечить создание curl 7.76.1. (спасибо Матиасу Барросу за обновление)

вам нужно будет скомпилировать как curl, так и ваш сервер ssl из исходного кода, очевидно, вам понадобится компилятор C и, возможно, еще что-то, но не знаю, что, надеюсь, это должно охватывать это:

sudo apt-get install gcc build-essential make cmake autoconf git automake libtool

это, вероятно, можно сделать с помощью нескольких бэкэндов ssl, но, поскольку я лучше всего знаком с OpenSSL, я продолжу с OpenSSL, чтобы собрать openssl, перейдите в репозиторий openssl по адресу https://github.com/openssl/openssl и найдите подходящую версию openssl, в этом примере я выбрал версию 1.1.1k (это последняя стабильная версия openssl на момент написания ),

git clone -b 'OpenSSL_1_1_1k' --single-branch --depth 1 https://github.com/openssl/openssl
cd openssl
./config no-shared enable-ssl2 enable-ssl3 enable-ssl3-method
make -j $(nproc)

(последний шаг может занять некоторое время), но сценарий сборки openSSL не создает папку lib, но сценарий сборки curl ожидает, что файлы lib будут находиться в папке lib внутри папки openssl, поэтому после make запустите

mkdir lib
cp *.a lib;

как только это будет сделано, пришло время сделать curl, так что cd .. оттуда и клонируйте последнюю версию curl поддержка ключей --sslv2 / --sslv3 7.76.1,

git clone -b 'curl-7_76_1' --single-branch --depth 1 https://github.com/curl/curl.git
cd curl
./buildconf
LDFLAGS="-static" ./configure --with-ssl=$(realpath ../openssl) --disable-shared  --enable-static
make -j $(nproc)

(если вам интересно, почему я использовал реальный путь: похоже, в скрипте сборки curl есть ошибка, которая приводит к сбою, если вы указываете относительный путь, поэтому, похоже, требуется абсолютный путь. если вам интересно, почему я сделал статическую сборку, также известную как - -disable-shared --enable-static, у вас может быть другая библиотека libopenssl в $PATH, поэтому, чтобы избежать конфликта со встроенным libopenssl Ubuntu, статическая сборка безопаснее.)

и наконец,

/temp2/curl# ./src/curl --sslv3 https://google.com
curl: (35) error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version

(поскольку https://google.com вообще больше не поддерживает sslv3.)

TL;DR

git clone -b 'OpenSSL_1_1_1k' --single-branch --depth 1 https://github.com/openssl/openssl
cd openssl
./config no-shared enable-ssl2 enable-ssl3 enable-ssl3-method
make -j $(nproc)
mkdir lib
cp *.a lib;
cd ..
git clone -b 'curl-7_76_1' --single-branch --depth 1 https://github.com/curl/curl.git
cd curl
./buildconf
LDFLAGS="-static" ./configure --with-ssl=$(realpath ../openssl) --disable-shared  --enable-static
make -j $(nproc)
./src/curl --sslv3 https://google.com
person hanshenrik    schedule 31.05.2019
comment
обратите внимание, что для сборки на Alpine необходимы следующие пакеты: apk add git autoconf automake libtool make cmake binutils gcc g++ linux-headers - person Donatello; 07.05.2021

Ошибка "protocol version (582)" означает, что сервер поддерживает максимальное количество TLSv1.0.

TLSv1.0 устарел и отключен в последний дистрибутив (например, Ubuntu 19+, Debian Buster+).

Указание аргумента --tlsv1.0 curl не поможет, так как протоколы отключены в OpenSSL.

Либо обновите сервер, к которому вы подключаетесь (предпочтительно),

... или включить TLSv1.0 в /etc/openssl.cnf:

[system_default_sect]
MinProtocol = TLSv1.2
CipherString = DEFAULT@SECLEVEL=2

изменить на

[system_default_sect]
MinProtocol = TLSv1.0
CipherString = DEFAULT@SECLEVEL=1

Примечание. SECLEVEL=1 включает SHA-1 и позволяет использовать ключ RSA длиной менее 2048 бит (вероятно, потребуется для подключения к старым серверам).

(не нужно ничего перекомпилировать)

person rustyx    schedule 04.03.2020
comment
по умолчанию поддержка SSLv3 больше не компилируется с OpenSSL, и для ее включения требуются специальные флаги времени компиляции, и я только что проверил openssl в комплекте с Xubuntu 20.04, он не был скомпилирован с поддержкой SSLv3 (самый низкий был TLS1.0), поэтому если вам нужен sslv3 или v2, вы должны скомпилировать openssl из исходного кода, а не просто настроить тот, который поставляется в комплекте с Ubuntu - person hanshenrik; 23.11.2020