原因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"