获取SSL证书到期及邮件发送

作为一个个人开发者,在开发网页服务的时候,势必要用到ssl证书,尤其是小程序,域名必须要求https。作为个人,一年几百块的证书多少还是有点肉疼的,当然个人项目使用免费的证书也没啥大问题(在我看来唯一的问题就是只支持单域名,都免费了还要啥自行车是不)。

但是自从证书有效期从一年改为三个月,问题就来了。原本我一年只需要统一更换一次即可,现在每三个月就需要处理一次,而且像服务平台(如:阿里云)在过期前一个月就会每天给你发送一封邮件、短信等提醒你更新,当然对方也是为了避免你的业务收到影响。

阿里云是每一个证书发送一篇邮件,由于每个证书的过期时间不一致,有可能今天更解决这个,明天还需要再更新另一个。然后想着能不能把所有快过期的汇总到一篇邮件里面,如果也方便查阅,咱说干就干

 

以下代码语言为PHP,所用框架为ThinkPHP5.1

封装一个获取证书相关信息的方法

“`

function getSSL(string $domain_name)
{

    try
    {
        $errno = 0;
        $err_str = '';
        $timeout = 30;
        $ssl_info = stream_context_create(["ssl" => ["capture_peer_cert" => TRUE]]);
        $stream = stream_socket_client("ssl://" . $domain_name . ":443", $errno, $err_str, $timeout, STREAM_CLIENT_CONNECT, $ssl_info);
        if ( ! $stream)
        {
            throw new Exception($err_str, $errno);
        }

        $cert_resource = stream_context_get_params($stream);
        $certificate = $cert_resource['options']['ssl']['peer_certificate'];
        $cert_info = openssl_x509_parse($certificate);
        fclose($stream);

        return $cert_info;
    } catch (Exception $exception)
    {
        fail_return($exception->getCode(), $exception->getMessage());
    }
}

“`

调用上面的方法

“`

public function index()
{
    try
    {
        $result = self::getSSL("16url.cn");
        if ($result['validFrom_time_t'] > time() || $result['validTo_time_t'] < time())
        {
            throw new Exception('证书已过期');
        }

        $start = date_create(date(DATE_RFC2822, $result['validTo_time_t']));
        $end = date_create();
        $diff = date_diff($start, $end);
        print "证书将在 " . $diff->days . " 天后过期";
    } catch (Exception $exception)
    {
        fail_return($exception->getCode(), $exception->getMessage());
    }
}

“`

既然证书的过期时间搞定了,那么接下来就是邮件发送了

安装一下三方库

composer require phpmailer/phpmailer

我安装的是6.9版本

以下为发送邮件的代码

“`

public function send($params)
{
    $subject = ! empty($params['subject']) ? $params['subject'] : "";//邮件标题
    $body = ! empty($params['body']) ? $params['body'] : "";//邮件内容
    $alt_body = ! empty($params['alt_body']) ? $params['alt_body'] : "text/html";//格式
    $receive_mail = ! empty($params['receive_mail']) ? $params['receive_mail'] : "";//收件人邮箱

    $mail = new PHPMailer(TRUE);

    try
    {

        $mail->Charset = $mail::CHARSET_UTF8;
        $mail->SMTPDebug = 0;
        $mail->isSMTP();
        //企业邮箱服务器
        $mail->Host = Env::get('mail_host');
        //端口
        $mail->Port = Env::get('mail_port');
        //授权
        $mail->SMTPAuth = TRUE;
        //发信地址
        $mail->Username = Env::get('mail_username');
        //SMTP 密码
        $mail->Password = Env::get('mail_password');
        //启用加密
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
        //显示发信地址
        $mail->setFrom(Env::get('mail_username'), Env::get('mail_name'));
        //收件人和昵称
        $mail->addAddress($receive_mail);

        $mail->Subject = $subject;
        $mail->Body = $body;
        $mail->AltBody = $alt_body;

        $mail->Sender = Env::get('mail_username');
        $mail->send();

        return "邮件发送发送成功";
    } catch (Exception $exception)
    {
        fail_return($exception->getCode(), $exception->getMessage());
    }
}

“`

这边用的是阿里邮箱

主机:ssl://smtp.mxhichina.com

端口:465

管理员账号可在企业邮箱-邮箱列表-邮箱管理-管理员账号查到

管理员密码也在上面位置找到,若忘记了,可以重置密码

具体可参考官方文档:https://help.aliyun.com/document_detail/437166.html?spm=a2c4g.57330.0.0.263812edyqeomD

Tagged , ,