Ubuntu PHP日志中的SSL错误怎么办
导读:Ubuntu 上 PHP SSL 错误的定位与修复指南 一、先快速定位错误类型 查看具体报错:在 Web 环境查看 PHP-FPM 或 Apache 错误日志;CLI 可直接运行脚本观察输出。 用最小脚本复现: file_get_con...
Ubuntu 上 PHP SSL 错误的定位与修复指南
一、先快速定位错误类型
- 查看具体报错:在 Web 环境查看 PHP-FPM 或 Apache 错误日志;CLI 可直接运行脚本观察输出。
- 用最小脚本复现:
- file_get_contents:
php -r "var_dump(file_get_contents('https://www.example.com/')); " - cURL:
php -r '$ch=curl_init(); curl_setopt($ch,CURLOPT_URL,"https://www.example.com/"); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); var_dump(curl_exec($ch)); var_dump(curl_error($ch)); '
- file_get_contents:
- 常见关键词与含义:
- SSL certificate problem / unable to get local issuer certificate:CA 证书链不完整或找不到。
- certificate verify failed:服务器证书无法被本地 CA 验证(自签名、过期、域名不匹配等)。
- segfault / SIGSEGV in libssl.so:OpenSSL 与 libcurl/编译时链接不一致或版本冲突。
- undefined reference to `TLSv1_client_method’:编译期 OpenSSL 链接异常或符号冲突。
二、常见场景与对应修复
-
CA 证书缺失或过期(cURL error 60 / verify failed)
- 安装系统 CA 证书包并更新 CA 存储:
sudo apt-get update sudo apt-get install --reinstall ca-certificates sudo update-ca-certificates --fresh - 在 php.ini 显式指定 CA 证书(二选一,按系统实际路径):
修改后重启 PHP-FPM/Apache。openssl.cafile=/etc/ssl/certs/ca-certificates.crt ; 或 curl.cainfo=/etc/ssl/certs/ca-certificates.crt - 若系统无可用 CA 包,可手动下载权威 CA 包并配置:
重启服务后复测。sudo mkdir -p /usr/local/openssl/ssl/certs sudo curl -o /usr/local/openssl/ssl/certs/cacert.pem https://curl.se/ca/cacert.pem # php.ini openssl.cafile=/usr/local/openssl/ssl/certs/cacert.pem curl.cainfo=/usr/local/openssl/ssl/certs/cacert.pem
- 安装系统 CA 证书包并更新 CA 存储:
-
自签名或私有 CA 证书
- 不建议关闭校验;将自签 CA 或服务器证书链合并为 bundle.crt,在 php.ini 指定:
openssl.cafile=/path/to/bundle.crt curl.cainfo=/path/to/bundle.crt - 或在代码中为 Guzzle/cURL 显式传入 CA 路径(避免全局放宽校验)。
- 不建议关闭校验;将自签 CA 或服务器证书链合并为 bundle.crt,在 php.ini 指定:
-
编译期 OpenSSL 与运行期不匹配(段错误、undefined reference 等)
- 现象:日志出现 segfault at … in libssl.so 或 undefined reference to `TLSv1_client_method’。
- 处理思路:
- 统一 OpenSSL 版本:升级/回退系统 OpenSSL,或编译时指定 OpenSSL 前缀,确保 PHP 与 libcurl 使用同一套 OpenSSL。
- 重新编译 PHP(示例思路):
# 准备 OpenSSL 1.1.1(如系统为 3.x 且需兼容旧版) wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1.tar.gz tar xf openssl-1.1.1.tar.gz & & cd openssl-1.1.1 ./Configure --prefix=/opt/openssl-1.1.1 -fPIC shared linux-x86_64 make -j$(nproc) & & sudo make install # 编译 PHP 时显式指定 OpenSSL export PKG_CONFIG_PATH=/opt/openssl-1.1.1/lib/pkgconfig export LD_LIBRARY_PATH=/opt/openssl-1.1.1/lib ./configure --with-openssl=/opt/openssl-1.1.1 [你的其他选项] make -j$(nproc) & & sudo make install - 若遇到 TLSv1_ 符号被错误库解析*(如被 libmysqlclient 占用),在 PHP 编译的 Makefile 的 EXTRA_LIBS 前显式加入 -lssl -lcrypto,清理后重编。
三、验证与回退
- 复测最小脚本,确认错误消失且返回 HTTP 200 内容。
- 若仍异常,临时将 curl.cainfo/openssl.cafile 指向 /etc/ssl/certs/ca-certificates.crt 并重启服务,以排除路径配置问题。
- 生产环境避免关闭校验(如 CURLOPT_SSL_VERIFYPEER=false),以免引入 MITM 风险。
四、实用命令清单
- 查看与更新 CA 证书:
sudo apt-get install --reinstall ca-certificates sudo update-ca-certificates --fresh ls -l /etc/ssl/certs/ca-certificates.crt - 查看 PHP 编译与加载的 SSL/CA 配置:
php -i | grep -E 'openssl|curl|SSL_CTX_set_default_verify_paths' php -r 'var_dump(openssl_get_cert_locations()); ' - 检查 libcurl/SSL 链接与版本:
curl -V ldd $(php -r 'echo ini_get("extension_dir"); ')/curl.so | grep ssl readelf -Ws $(which php) | grep -i tls - 重启服务:
sudo systemctl restart php-fpm sudo systemctl restart apache2
声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!
若转载请注明出处: Ubuntu PHP日志中的SSL错误怎么办
本文地址: https://pptw.com/jishu/772957.html
