新增后台系统SSL证书查询提醒功能

  核心更新内容
  - 新增 SSL 证书信息查询功能,集成至主页统计卡片,无需跳转独立页面,直观展示证书关键信息
  - 卡片内实时渲染当前授权域名、证书过期时间、证书剩余天数,剩余天数<15天时自动标红提醒,提升运维便捷性
  - 证书查询逻辑采用系统命令调用方式(openssl),支持所有面板(含宝塔),100%避免域名串号问题,适配项目多域名部署场景
  代码优化与调整
  - 在 main() 控制器方法中新增证书信息获取逻辑,通过 $_SERVER['HTTP_HOST'] 自动获取当前访问域名,无需手动配置
  - 新增 domain、validTo、days 三个模板变量,统一赋值至 assign 方法,与原有统计变量兼容,不影响原有业务逻辑(统计、图表、跟进动态等功能正常运行)
  - 优化 HTML 卡片渲染逻辑,添加条件判断(剩余天数<15天标红提醒),保持与原有页面样式、字体大小一致,提升视觉统一性
  - 证书查询逻辑添加异常处理,当服务器安全限制导致获取失败时,默认显示“获取失败”,避免页面报错
  更新细则
  - 涉及更新页面主控制器Index.php里的public function main()函数内查找$this->assign大约在249行
  于$this->assign内容上下添加如下参考代码:

// 获取域名证书信息
    $domain = $_SERVER['HTTP_HOST'] ?? '';
    $validTo = '获取失败';
    $days = 0;

    if ($domain) {
    $context = stream_context_create([
        'ssl' => [
            'capture_peer_cert' => true,
            'verify_peer' => false,
            'verify_peer_name' => false,
        ]
    ]);

    // 建立连接
    $stream = @stream_socket_client(
        "ssl://{$domain}:443",
        $errno,
        $errstr,
        30,
        STREAM_CLIENT_CONNECT,
        $context
    );

    // 默认值:未安装证书
    $validTo = '未安装 SSL 证书';
    $days = 0;

    if ($stream) {
        // 获取证书信息
        $params = stream_context_get_params($stream);
        $cert = openssl_x509_parse($params['options']['ssl']['peer_certificate']);

        if ($cert && isset($cert['validTo_time_t'])) {
            // 验证证书域名是否匹配
            $cert_domain = trim($cert['subject']['CN'] ?? '');
            if ($cert_domain === $domain) {
                // 证书有效且匹配域名
                $expireTime = $cert['validTo_time_t'];
                $validTo = date('Y-m-d H:i:s', $expireTime);
                $days = intval(($expireTime - time()) / 86400) - 1;
                if($days < 0) $days = 0;
            }
        }
        fclose($stream);
    }
    }
 $this->assign([
//原来值不变//
// 新增证书查询
        'domain' => $domain,
        'validTo' => $validTo,
        'days' => $days,
        ]);

  旧版本无$this->assign([])数值请直接在 $this->assign('config', $config);后添加如下代码:

$this->assign('domain', $domain);
$this->assign('validTo', $validTo);
$this->assign('days', $days);

  相关渲染页面于系统收集总客户模块后添加如下代码(约130行后):

                        <div class="col-xl col-sm-6 col-12">
                            <div class="card">
                                <div class="card-body">
                                    <p class="text-muted mt-3 mb-0" style="font-size:14px">✅ 当前授权域名:{$_SERVER['HTTP_HOST']}</p>
                                    <p class="text-muted mt-3 mb-0" style="font-size:14px">✅ 证书过期时间:{$validTo}</p>
                                    
                                    {if $days < 15}
                                    <p class="mt-3 mb-0" style="font-size:14px;color:red;font-weight:bold;">
                                        ✅ 证书剩余天数:{$days} 天 ⚠️ 即将过期
                                    </p>
                                    {else}
                                    <p class="text-muted mt-3 mb-0" style="font-size:14px">
                                        ✅ 证书剩余天数:{$days} 天
                                    </p>
                                    {/if}
                                </div>
                            </div>
                        </div>

  注意事项
  - 证书查询依赖服务器 openssl 环境,若获取失败,请检查服务器是否安装并启用 openssl 扩展
  - 剩余天数计算逻辑为(证书过期时间 - 当前时间)/86400 - 1,确保计算精度,与实际剩余有效期一致
  - 本次更新不影响原有缓存机制、数据库查询优化、业务员业绩统计等核心功能,可直接部署使用
  兼容说明
  兼容原有项目所有功能模块,适配宝塔及其他主流服务器面板,无需修改服务器配置,部署后即可正常显示证书信息。