🚀

PHPスクリプトでSSL証明書期限を監視してみる

2021/12/05に公開

概要

ドメインのSSL証明書期限をopensslでチェックして監視するスクリプトを作った時の備忘録

スクリプト

ssl_watch.php
<?php

$domain_names = [
    'google.com',
    'yahoo.jp'
];

# ChatWorkの通知するルームID
define('DEFAULT_ROOM_ID', 'xxxx');

# ChatWorkのユーザートークン
define('DEFAULT_USER_TOKEN', 'xxxx');
$warning_messages = [];
$nossl_messages = [];
foreach ($domain_names as $domain_name) {
    */
    /**===================================
     * * shell_exec()でコマンドを実行します
     * * openssl s_client xxx 以降でSSL情報を取得
     * * notAfter = 証明書期限なので抜き出す
     * * GMT グリニッジ標準時になっているのでDateTimeで
     * * 日本の日付に変換します
     *====================================**/
    unset($_warning_message);
    unset($_nossl_message);
 
    $response = shell_exec("(timeout 1 openssl s_client -servername {$domain_name} -connect {$domain_name}:443 2>/dev/null | openssl x509 -noout -enddate | grep notAfter | sed -e s#notAfter=##)");
    $expire_date = $response ? (new DateTime($response, new DateTimeZone('ASIA/TOKYO')))->format('Y-m-d') : null;
    if (!$expire_date) $_nossl_message = "【SSL証明書期限】{$domain_name} (期限切れもしくは取得失敗)";
    if (IS_TEST || strtotime($expire_date) < mktime(0, 0, 0, date('m') + 1, date('d'), date('Y'))) $_warning_message = "【SSL証明書期限】{$domain_name} ({$expire_date})";
    if (!empty($_warning_message)) {
        if (IS_TEST) $_warning_message = 'TEST ' . $_warning_message;
        $warning_messages[] = $_warning_message;
        echo $_warning_message . "\n";
    }
    if (!empty($_nossl_message)) {
        if (IS_TEST) $nossl_messages = 'TEST ' . $_nossl_message;
        $nossl_messages[] = $_nossl_message;
        echo $_nossl_message . "\n";
    }
}
//if(!empty($warning_messages)) SendSlack::send(implode("\n", $warning_messages));
if (!empty($warning_messages)) SendSlack::exec_notice("[toall]" . implode("\n", $warning_messages), '期限が1ヶ月前のSSL一覧通知');
if (!empty($nossl_messages)) SendSlack::exec_notice("[toall]" . implode("\n", $nossl_messages), '期限切れもしくはHTTPSじゃ無いSSL一覧通知');
return;

class SendMessage {
    
    //チャットワーク通知
    public static function exec_notice($message, $title = null, $room_id = null, $user_token = null) {
        if (!$room_id) {
            $room_id = DEFAULT_ROOM_ID;
        }
        if (!$user_token) {
            $user_token = DEFAULT_USER_TOKEN;
        }
        // デフォルト値
        $curl = null;
        // タイムアウト 2秒
        $timeout_sec = 2;
        // ルームIDを指定してCURL初期化
        $curl = curl_init('https://api.chatwork.com/v2/rooms/' . $room_id . '/messages');
        // ユーザトークン
        $headers = array('X-ChatWorkToken: ' . $user_token);
        // 通知内容
        $body = '';
        if (is_null($title)) {
            $body = $message;
        } else {
            $body = '[info][title]';
            $body .= $title;
            $body .= '[/title]';
            $body .= $message;
            $body .= '[/info]';
        }
        $fields = ['body' => $body];
        // オプションを設定
        curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($fields));
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        // 通知実行
        $ret = curl_exec($curl);
        // 処理結果
        if ($ret === false) {
            return false;
        }
        return (strpos($ret, 'message_id') !== false);
    }
}

最後に

読んでいただきありがとうございます。
今回の記事はいかがでしたか?
・こういう記事が読みたい
・こういうところが良かった
・こうした方が良いのではないか
などなど、率直なご意見を募集しております。

GitHubで編集を提案

Discussion