原因ubuntu的php7.2版本 php请求 curl https gnutls recv error -110 The TLS connection was non-properly terminated.[ssl_version] => GnuTLS/3.8.3 ,[version_number] => 525568,[libz_version] => 1.3出现这个错误

因为系统curl使用的 GnuTLS/3.8.3 不兼容导致

解决办法:

要让 PHP 使用 OpenSSL 作为 cURL 的 TLS 后端,最彻底、最可控的方法是:先手动编译 OpenSSL,再编译 libcurl(链接到你编译的 OpenSSL),最后编译 PHP(链接到你编译的 libcurl)

这样可以完全绕过系统 libcurl 使用 GnuTLS 或 NSS 的问题。

# 创建工作目录
mkdir ~/build && cd ~/build

# 安装编译依赖
sudo apt update
sudo apt install -y build-essential autoconf libtool pkg-config git

🔧 第一步:编译 OpenSSL(推荐 1.1.1 或 3.0 )

PHP 7.2 兼容 OpenSSL 1.1.1 和 3.0,推荐使用 OpenSSL 1.1.1w(稳定)

方式 A:编译 OpenSSL 1.1.1(推荐用于 PHP 7.2)

cd ~/build
wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz
tar -xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w

# 配置(安装到 /usr/local/openssl-1.1.1)
./config --prefix=/usr/local/openssl-1.1.1 --openssldir=/usr/local/openssl-1.1.1 shared zlib

# 编译并安装
make -j$(nproc)
sudo make install

方式 B:编译 OpenSSL 3.0

cd ~/build
wget https://www.openssl.org/source/openssl-3.0.13.tar.gz
tar -xzf openssl-3.0.13.tar.gz
cd openssl-3.0.13

./config --prefix=/usr/local/openssl-3.0 --openssldir=/usr/local/openssl-3.0 shared zlib
make -j$(nproc)
sudo make install

第二步:编译 libcurl(链接到你编译的 OpenSSL)

下载 libcurl 源码

cd ~/build
wget https://curl.se/download/curl-8.5.0.tar.gz
tar -xzf curl-8.5.0.tar.gz
cd curl-8.5.0

# 创建安装目录
sudo mkdir -p /usr/local/curl

配置(关键:指定 OpenSSL 路径)

如果你编译了 OpenSSL 1.1.1:

./configure \
  --prefix=/usr/local/curl \
  --with-openssl=/usr/local/openssl-1.1.1 \
  --without-gnutls \
  --without-nss \
  --enable-shared \
  --enable-optimize \
  --disable-ldap \
  --disable-ldaps

如果你编译了 OpenSSL 3.0:

./configure \
  --prefix=/usr/local/curl \
  --with-openssl=/usr/local/openssl-3.0 \
  --without-gnutls \
  --without-nss \
  --enable-shared \
  --enable-optimize \
  --disable-ldap \
  --disable-ldaps

关键参数:

  • --with-openssl=/path:指定你编译的 OpenSSL 路径
  • --without-gnutls --without-nss:禁用其他 TLS 后端
  • --enable-shared:生成动态库(PHP 需要)

编译并安装 libcurl

make -j$(nproc)
sudo make install

验证 libcurl 是否使用 OpenSSL

# 临时设置库路径 可以不加
export LD_LIBRARY_PATH="/usr/local/curl/lib:/usr/local/openssl-1.1.1/lib:$LD_LIBRARY_PATH"
# 或如果是 OpenSSL 3.0: /usr/local/openssl-3.0/lib

# 运行 curl --version
/usr/local/curl/bin/curl --version

正确输出应为:

curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/1.1.1w
如果显示 OpenSSL,说明成功!

配置系统库路径(可选)

为了让系统找到你编译的库,添加库路径:

echo '/usr/local/curl/lib' | sudo tee /etc/ld.so.conf.d/curl.conf
echo '/usr/local/openssl-1.1.1/lib' | sudo tee /etc/ld.so.conf.d/openssl.conf

# 更新动态链接库缓存
sudo ldconfig

第三步:后续编译 PHP 时使用自编译的 libcurl

当你编译 PHP 7.2 时,使用:

cd php-7.2.34

./configure \
  --prefix=/usr/local/php72 \
  --with-config-file-path=/usr/local/php72/etc \
  --with-curl=/usr/local/curl \
  --with-openssl=/usr/local/openssl-1.1.1 \
  --enable-mbstring \
  --enable-fpm \
  ...

关键:

  • --with-curl=/usr/local/curl:指向你编译的 libcurl
  • --with-openssl=/usr/local/openssl-1.1.1:指向你编译的 OpenSSL
make -j$(nproc)
sudo make install

最终验证 PHP cURL

<?php
$curl = curl_version();
echo "SSL Version: " . $curl['ssl_version'] . "\n";
echo "cURL Version: " . $curl['version'] . "\n";
?>

运行:

/usr/local/php72/bin/php test.php

输出:

SSL Version: OpenSSL/1.1.1w
cURL Version: 8.5.0
或者
/usr/local/php72/bin/php -r "var_dump(curl_version());"

输出
string(14) "OpenSSL/1.1.1w"