From 754a8f18b8e612fe6f2434df86f14c906386d5ff Mon Sep 17 00:00:00 2001
From: "Hahn Axel (hahn)" <axel.hahn@iml.unibe.ch>
Date: Wed, 6 Oct 2021 10:31:00 +0200
Subject: [PATCH] add check_ssl_certs

---
 check_ssl_certs | 172 ++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 172 insertions(+)
 create mode 100644 check_ssl_certs

diff --git a/check_ssl_certs b/check_ssl_certs
new file mode 100644
index 0000000..b9a64ed
--- /dev/null
+++ b/check_ssl_certs
@@ -0,0 +1,172 @@
+#!/bin/bash
+# ======================================================================
+#
+# SSL check - warn if a ssl certificate expires.
+#
+# Check locally installed SSL client certificates and warn if the 
+# expiration date comes closer. 
+#
+# USAGE: check_ssl_certs [-w WARN_LIMIT] [-c CRITICAL_LIMIT] [-f "FILELIST"]
+# HELP: check_ssl_certs -h
+#
+# ----------------------------------------------------------------------
+# 2021-10-06  v0.1  <axel.hahn@iml.unibe.ch>  initial version
+# ======================================================================
+
+. `dirname $0`/inc_pluginfunctions
+
+typeset -i iWarn=14
+typeset -i iCrit=5
+typeset -i iNow=$( date +%s )
+
+bHasCritical=false
+bHasWarning=false
+
+shortstatus=""
+fullstatus=""
+
+filelist="/etc/ssl/certs/*.cert.cer"
+
+# ----------------------------------------------------------------------
+# functions
+# ----------------------------------------------------------------------
+
+function showHelp(){
+cat <<EOF
+______________________________________________________________________
+
+CHECK_SSL_CERTS
+
+(c) Institute for Medical Education - Univerity of Bern
+Licence: GNU GPL 3
+______________________________________________________________________
+
+Check locally installed SSL client certificates and warn if the 
+expiration date comes closer. 
+
+SYNTAX:
+`basename $0` [-w WARN_LIMIT] [-c CRITICAL_LIMIT] [-f FILELIST]
+
+OPTIONS:
+
+    -f FILELIST    file filter to find certificates using globbing (default: $filelist)
+                   To use multiple sources seperate them with a space char.
+                   Quote your parameter value if you use multiple sources or * char.
+    -w VALUE       warning level in days before expiration (default: $iWarn)
+    -c VALUE       critical level in days before expiration (default: $iCrit)
+
+    -h or --help   show this help.
+
+PARAMETERS:
+
+    None.
+
+EXAMPLE:
+
+    `basename $0` -f "/etc/ssl/certs/*example.com.*.cer /etc/somewhere/else/*.cer"
+        Set 2 folders where to find the client certificates.
+        They are seperated by space and both use * for globbing
+
+    `basename $0` -w 30 -c 3 
+        Overide the warning and critical level.
+
+EOF
+}
+
+# ----------------------------------------------------------------------
+# MAIN
+# ----------------------------------------------------------------------
+
+
+# ----- check param -h
+case "$1" in
+    "--help"|"-h")
+        showHelp
+        exit 0
+        ;;
+    *)
+esac
+
+
+# ----- check required tools
+
+ph.require openssl
+
+
+# --- override from command line params
+filelist=`ph.getValueWithParam $filelist f "$@"`
+iWarn=`   ph.getValueWithParam $iWarn    w "$@"`
+iCrit=`   ph.getValueWithParam $iCrit    c "$@"`
+
+
+# ----- check cert files
+
+typeset -i iCounter=0
+typeset -i iTotal=$( ls -1 $filelist 2>/dev/null | wc -l )
+if [ $iTotal -eq 0 ]; then
+        bHasWarning=true
+        shortstatus="No cert was found."
+        fullstatus="!!! Warning: no file matches the file filter. HINT: a $filelist."
+fi
+for mycert in $( ls -1 $filelist 2>/dev/null )
+do
+        iCounter=$iCounter+1
+        data=$(openssl x509 -noout -text -in $mycert 2>/dev/null )
+        mySubject=$( echo "$data" | grep "Subject:\ CN\ =\ " | cut -f 2- -d "=" | grep -v ",")
+        if [ -z "$mySubject" ]; then
+                bHasWarning=true
+                fullstatus="${fullstatus}
+                !!! WARNING: File $mycert is no client certificate. HINT: adjust your file filter in -f FILEFILTER"
+        else
+
+            dateExpire=$( echo "$data" | grep "Not\ After" | cut -f 2- -d ":" )
+
+            typeset -i iExpire=$( date +%s -d "$dateExpire" )
+            typeset -i iLeft=($iExpire-$iNow)/60/60/24
+
+            if [ $iLeft -lt $iWarn ]; then
+                    if [ $iLeft -lt $iCrit ]; then
+                            bHasCritical=true
+                            if [ $iLeft -lt 0 ]; then
+                                    result="EXPIRED ALREADY"
+                            else
+                                    result="Expires VERY SOON"
+                            fi
+                    else
+                            bHasWarning=true
+                            result="Expires soon"
+                    fi
+            else
+                    result="OK"
+            fi
+            shortstatus="${shortstatus}${result} ${mySubject} [${iLeft}d] |"
+            fullstatus="${fullstatus}
+----- $iCounter/ $iTotal: ${mySubject} - $iLeft days 
+$( echo "$data" | grep -E "(DNS:|Issuer:|Not\ |Subject:)" | sed 's#^\ *##g')
+File: $mycert"
+
+            ph.perfadd "ssl-$mySubject"       "${iLeft}"       "" "" 0 ""
+        fi
+done
+
+
+# ----- set status based on worst result
+
+if [ $bHasCritical = true ]; then
+        ph.setStatus critical
+elif [ $bHasWarning = true ]; then
+        ph.setStatus warning
+fi
+
+
+# ------ outout
+
+ph.status "SSL certs | $shortstatus"
+echo "$fullstatus"
+echo
+echo "INFO: warning below $iWarn d before expiration; raise to critical $iCrit days before"
+echo
+
+ph.exit
+
+# ----------------------------------------------------------------------
-- 
GitLab