🚀
PHPスクリプトでSSL証明書期限を監視してみる
概要
ドメインの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);
}
}
最後に
読んでいただきありがとうございます。
今回の記事はいかがでしたか?
・こういう記事が読みたい
・こういうところが良かった
・こうした方が良いのではないか
などなど、率直なご意見を募集しております。
Discussion