Всем привет.
SSL (TLS) сертификаты стали важным компонентом современной инфраструктуры, поэтому администратору нужно следить за тем, чтобы они не истекали и вовремя их обновлять. Удобно отслеживать срок действия SSL сертификатов на ваших сайтах с помощью системы мониторинга Zabbix.
В ранних версиях Zabbix для мониторинга SSL сертификатов приходилось использовать консольные скрипты, которые передают значения в Zabbix через UserParameter. В Zabbix Agent 2 появись возможность получения информации о сертификате с помощью встроенного плагина WebCertificate.
Вот здесь рассмотрены оба способа мониторинга срока действия SSL.
По второму способу скажу сразу что скрипт автора /usr/lib/zabbix/externalscripts/sslcert_expiration.sh однозначно рабочий:
#!/bin/bash
data=`echo | openssl s_client -servername $1 -connect $1:${2:-443} 2>/dev/null | openssl x509 -noout -enddate | sed -e 's#notAfter=##'`
ssldate=`date -d "${data}" '+%s'`
nowdate=`date '+%s'`
diffdate="$((${ssldate}-${nowdate}))"
echo $((${diffdate}/86400))
Кстати им же можно проверять сертификаты и на сереверах в локальной сети предприятия.
Но есть нюас.) В Linux без них никуда. При его тестировании на моем сервере Zabbix выскочил глюк на определении diffdate, что ему не делал скрипт тут падал в ошибку: «syntax error: invalid arithmetic operator (error token is «.
Решил я прибегнуть к помощи ChatGPT, сейчас это модно. Далее приведу варианты его решения которые он мне предлагал вчера вечером. Показываю только то те строки где он предлагал изменить в исходном коде для устранения ошибки:
1)
data=$(echo | openssl s_client -servername "$1" -connect "$1":${2:-443} 2>/dev/null | openssl x509 -noout -enddate | awk -F '=' '{print $2}')
2)
diffdate=$((`date -d "$ssldate" '+%s'`- `date -d "$nowdate" '+%s'`))
3)
# Using Python to calculate the difference in seconds
diffdate=$(python -c "from datetime import datetime; print(int((datetime.strptime('$data', '%b %d %H:%M:%S %Y %Z') - datetime.now()).total_seconds()))")
4)
# Retrieve the SSL certificate end date
data=$(echo | openssl s_client -servername "$1" -connect "$1":${2:-443} 2>/dev/null | openssl x509 -noout -dates | grep 'notAfter' | cut -d '=' -f 2)
5)
# Calculate the difference in seconds using 'bc' command
diffdate=$(echo "$ssldate - $nowdate" | bc)
Проверка решений своим поиском по Google привела к тем же вариантам, так что ChatGPT не соврал. Но увы, ни один из способов к успеху не привел. Видно хорошо был сформатирован код моего Zabbix appliance.
Надеюсь вам повезет больше. Удачи.
# cat /etc/zabbix/scripts/sslcheck/ssl_check.sh
ReplyDelete#!/bin/sh
SERVER=$1
TIMEOUT=25
RETVAL=0
TIMESTAMP=`echo | date`
if [ -z "$2" ]
then
PORT=443;
else
PORT=$2;
fi
EXPIRE_DATE=`echo | openssl s_client -connect $SERVER:$PORT -servername $SERVER 2>/dev/null | openssl x509 -noout -dates 2>/dev/null | grep notAfter | cut -d'=' -f2`
EXPIRE_SECS=`date -d "${EXPIRE_DATE}" +%s`
EXPIRE_TIME=$(( ${EXPIRE_SECS} - `date +%s` ))
if test $EXPIRE_TIME -lt 0
then
RETVAL=0
else
RETVAL=$(( ${EXPIRE_TIME} / 24 / 3600 ))
fi
echo ${RETVAL}
#!/bin/sh
ReplyDelete#Prepared by Marcin 'szremo' Szremski'
#setenv LC_ALL en_GB.UTF-8
LC_ALL=en_GB.UTF-8
export LC_ALL
SSL_DATE=$(echo | /usr/local/bin/openssl s_client -servername $1 -connect $1:443 2>/dev/null | /usr/local/bin/openssl x509 -noout -dates | /usr/bin/grep notAfter | /usr/bin/awk -F = '{ print $2 }' | /usr/bin/awk 'BEGIN {OFS = "-"} {print $1,$2,$4}')
#echo $SSL_DATE
EXPTIME=$(/bin/date -j -f "%b-%d-%Y" $SSL_DATE +%s)
#echo $EXPTIME
TODAY=$(/bin/date +"%b-%d-%Y")
#echo $TODAY
CURRENT=$(/bin/date -j -f "%b-%d-%Y" $TODAY +%s)
#echo $CURRENT
LC_ALL=ru_RU.UTF-8
export LC_ALL
NUM=$(($EXPTIME - $CURRENT))
RESULT=$(($NUM/86400))
echo $RESULT