As I Please

MTのいんすとーるの練習と、その他びぼうろく・・・

ローカルの証明書の有効期限を通知

CentOSだと、yum でcrypt-util をinstall すると certwatch が cronで起動され、自ホストのwebサーバーのSSL証明書の有効期限を通知してくれる。 FreeBSDで似たようなのを探したがちょっと見当たらないので、SSL証明書の有効期限をチェックするをパクらせてもらって、自サーバーのローカルにある証明書(smtps,imaps,他)のチェックを行い、メールを送信するスクリプトを作成。 メールの送信で、文字化けがあったので、いまさらですが jis7に変換して送っています。 サーバ証明書でもクライアント証明書でもどちらでもOK。私はいつも crtとpemをくっつけて1つのpemファイルを証明書として使っていますが。。。'openssl x509 -enddate' で 'notAfter'の文字列が出てくるものならどれでもOKと思います。 これで思わぬ証明書の期限切れが防げるかな。(クライアント証明書で良くやらかしてる)
#!/usr/bin/perl
#
#  check_crt.pl
#
#    ref. http://www.jitaku-svr.info/index.php?SSL%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E6%9C%89%E5%8A%B9%E6%9C%9F%E9%99%90%E3%82%92%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%99%E3%82%8B
#
use utf8;
use Encode;
use MIME::Base64;
use Date::Simple;
use DateTime::Format::Strptime;
use Time::Piece;
use Net::SMTP;
$server_ssl = `/usr/bin/openssl x509 -enddate -in $ARGV[0] |/bin/grep notAfter`;
$server_ssl =~ s/notAfter\=//;
$server_ssl =~ s/GMT//;
$date_pers = Time::Piece->strptime($server_ssl, '%b %d %H:%M:%S %Y ');
$ssl_limit = Date::Simple->new($date_pers->ymd);
$SSL_year = $date_pers->strftime("%Y");
$SSL_mon  = $date_pers->strftime("%m");
$SSL_day  = $date_pers->strftime("%d");
$today = Date::Simple->new();
$diff = $ssl_limit - $today;
$FROM = 'ssl_report@foo.baa;
$MAILTO = 'root@foo.baa';
$HOST = '127.0.0.1';
##証明書期限「60日前」、「30日前」、「10日前」、「7日前から」、が条件
if ( $diff == "60" or $diff == "30" or $diff == "10" or $diff <= "7" ) {
##証明書期限当日のみ
if ( $diff == 0 ) {
$from = "$FROM";
$mailto = "$MAILTO";
$subject ="【$ARGV[0]】【最終日】SSL証明書期限レポート";
$header = << "MAILHEADER";
From: $from
To: $mailto
Subject: $subject
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
MAILHEADER
$message = << "_HERE_";
ファイル名:【$ARGV[0]】
有効期限:$SSL_year年$SSL_mon月$SSL_day日
$ARGV[0]の証明書は本日最終日です。
証明書の更新を行ってください。
または、至急担当者へ連絡してください。
_HERE_
##証明書の期限が切れている場合のみ
} elsif ( $diff < 0 ) {
$from = "$FROM";
$mailto = "$MAILTO";
$subject ="【$ARGV[0]】【期限切れ】SSL証明書期限レポート";
$header = << "MAILHEADER";
From: $from
To: $mailto
Subject: $subject
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
MAILHEADER
$message = << "_HERE_";
有効期限:$SSL_year年$SSL_mon月$SSL_day日
$ARGV[0]の証明書切れています。
至急、担当者に確認してください。
_HERE_
##それ以外の条件は以下の連絡方法
} else {
$from = "$FROM";
$mailto = "$MAILTO";
$subject ="【$ARGV[0]】【$diff日前】SSL証明書期限レポート";
$header = << "MAILHEADER";
From: $from
To: $mailto
Subject: $subject
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-2022-jp
Content-Transfer-Encoding: 7bit
MAILHEADER
$message = << "_HERE_";
ファイル名:【$ARGV[0]】
有効期限:$SSL_year年$SSL_mon月$SSL_day日
$ARGV[0]の証明書は$diff日前になりました。
_HERE_
}
$header_jis = encode("iso-2022-jp",$header);
$message_jis =  encode("7bit-jis",$message);
$smtp = Net::SMTP->new("$HOST");
$smtp->mail($from);
$smtp->to($mailto);
$smtp->bcc(@mail_bcc);
$smtp->data();
$smtp->datasend($header_jis);
$smtp->datasend($message_jis);
$smtp->dataend();
$smtp->quit;
}
追伸 環境によっては、
Error parsing time at /usr/local/lib/perl5/5.12.4/mach/Time/Piece.pm line 470.
と perlがエラーを返すことがあった。 どうも環境変数 LANG=ja_JP.UTF-8 あたりを設定していると、timeが日本語文字列を返すためと思われ。 あたまのほうに use POSIX qw(setlocale LC_ALL); setlocale(LC_ALL, "C"); として、locale C にしてやるとちゃんと行ったようだ。

コメントする