首页主机资讯Ubuntu PHP日志中的SSL错误怎么办

Ubuntu PHP日志中的SSL错误怎么办

时间2025-12-16 16:52:03发布访客分类主机资讯浏览1365
导读: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));
          '
      
  • 常见关键词与含义:
    • 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 证书(二选一,按系统实际路径):
      openssl.cafile=/etc/ssl/certs/ca-certificates.crt
      ;
           或
      curl.cainfo=/etc/ssl/certs/ca-certificates.crt
      
      修改后重启 PHP-FPM/Apache
    • 若系统无可用 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 或服务器证书链合并为 bundle.crt,在 php.ini 指定:
      openssl.cafile=/path/to/bundle.crt
      curl.cainfo=/path/to/bundle.crt
      
    • 或在代码中为 Guzzle/cURL 显式传入 CA 路径(避免全局放宽校验)。
  • 编译期 OpenSSL 与运行期不匹配(段错误、undefined reference 等)

    • 现象:日志出现 segfault at … in libssl.soundefined 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
Ubuntu PHP日志中的并发问题怎么处理 PHP日志中的语法错误怎么定位

游客 回复需填写必要信息