新增后台系统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,确保计算精度,与实际剩余有效期一致
- 本次更新不影响原有缓存机制、数据库查询优化、业务员业绩统计等核心功能,可直接部署使用
兼容说明
兼容原有项目所有功能模块,适配宝塔及其他主流服务器面板,无需修改服务器配置,部署后即可正常显示证书信息。