如何在Ubuntu上使用旧版SSL支持编译Curl?

时间:2019-05-30 11:12:38

标签: curl ubuntu-18.04

当尝试使用Curl连接到启用HTTPS的旧网站时,出现以下错误:

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

我已经咨询了以下页面,以了解如何使用SSL2 / 3支持构建Curl,但是我不确定如何启用它。

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

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

错误“ protocol version (582) ”表示服务器最多支持 TLSv1.0

TLSv1.0已deprecated,并且在最新发行版(例如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位(可能需要连接到旧服务器)。

(无需重新编译任何内容)

答案 1 :(得分:1)

您将需要从源代码编译curl和ssl后端,显然您需要C编译器,可能还需要更多的东西,但是idk什么,希望它能涵盖它:

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

这可能可以通过多个ssl后端完成,但是由于我最熟悉OpenSSL,因此我将继续使用OpenSSL,以构建openssl转到https://github.com/openssl/openssl处的openssl存储库,并找到合适的openssl版本,在此示例中,我选择了1.1.1c版(这是撰写本文时最新的稳定的openssl发行版),

git clone -b 'OpenSSL_1_1_1c' --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文件位于openssl文件夹内的lib文件夹中,因此在make之后,运行

mkdir lib
cp *.a lib;

一旦完成,就该卷曲了,所以cd ..在那里克隆出最新版本的curl,在本例中,我使用curl 7.65.0(撰写本文时,最新的curl发行版),

git clone -b 'curl-7_65_0' --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)

((如果您怀疑我为什么使用realpath:curl的buildscript中似乎存在一个错误,如果您提供相对路径,它会失败,因此似乎是绝对路径)。如果您想知道为什么我做了一个static,构建aka --disable-shared --enable-static,您的$ PATH中可能有一个不同的libopenssl库,因此为了避免与ubuntu的内置libopenssl发生冲突,静态构建会更安全。)

最后

/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。)