AI 写的PHP监控 SSL 证书的剩余天数

回复:4 查看:33
an666 Lv.3
3小时前 发布 广西

除了自动续费SSL以外,还担心证书过期,用 AI 写个 PHP 代码,挂宝塔计划任务,然后,再加邮件提醒就行了。

<?php
error_reporting(0);
header('Content-type:text/html;charset=utf-8');
date_default_timezone_set('Asia/Shanghai');

/**
 * curl方式获取SSL证书剩余天数
 * @param string $domain 纯域名,不带http/https
 * @param int $port
 * @param int $timeout
 * @return int|bool false=失败,int剩余天数(负数=过期)
 */
function sslRemainDays($domain, $port = 443, $timeout = 3)
{
    // 环境检测
    if (!extension_loaded('curl') || !extension_loaded('openssl')) {
        return false;
    }
    // 清洗域名
    $domain = trim(str_replace(['https://', 'http://'], '', $domain));
	if (!empty($domain)){
		if (strpos($domain, '?') !== false) {$domain = strstr($domain, '?', true);}
		if (strpos($domain, '/') !== false) {$domain = strstr($domain, '/', true);}
	}
    if (empty($domain)) {return false;}

    $ch = curl_init();
    curl_setopt_array($ch, [
        CURLOPT_URL => "https://{$domain}:{$port}",
        CURLOPT_PORT => $port,
        CURLOPT_TIMEOUT => $timeout,
        CURLOPT_CONNECTTIMEOUT => $timeout,
        // 完全关闭SSL证书验证(你要的跳过校验)
        CURLOPT_SSL_VERIFYPEER => false,
        CURLOPT_SSL_VERIFYHOST => 0,
        // 强制抓取完整证书链
        CURLOPT_CERTINFO => true,
        // 不输出页面内容,只拿握手信息
        CURLOPT_NOBODY => true,
        CURLOPT_FOLLOWLOCATION => false,
        // 携带SNI,解决多证书主机
        //CURLOPT_SSL_HOSTNAME => $domain,
        // 兼容全版本TLS
        CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1_2
    ]);

    // 执行请求
    $res = curl_exec($ch);
    $certInfoList = curl_getinfo($ch, CURLINFO_CERTINFO);
    $curlErr = curl_errno($ch);
    curl_close($ch);

    // curl握手失败
    if ($curlErr !== 0 || empty($certInfoList)) {
        return false;
    }
    // 取服务器主证书
    $certRaw = $certInfoList[0]['Cert'];
    $certData = openssl_x509_parse($certRaw);
    if (empty($certData['validTo_time_t'])) return false;

    $diffSec = $certData['validTo_time_t'] - time();
    $remainDays = ceil($diffSec / 86400);
    return intval($remainDays);
}

// 测试
$domain = 'www.260.cn';
$days = sslRemainDays($domain);

if ($days === false) {
    echo '证书查询失败:curl/openssl扩展缺失、网络443不通或站点TLS握手被拒绝';
} elseif ($days < 0) {
    echo "【警告】证书已过期,过期" . abs($days) . "天,请立即更换!";
} elseif ($days <= 5) {
    echo "【紧急提醒】证书仅剩 {$days} 天到期,尽快申请新证书!";
} else {
    echo "证书剩余 {$days} 天";
}
?>

这个是AI写的源码,加上邮件提示,或者封装起来作为API使用也可以。

打赏
点赞
收藏
分享