#!/bin/bash
# Prüfe vollständige Zertifikatskette inklsuive ROOT Zertifikate
# Dieses Skript verwendet die vollständige Zertifikatskette und prüft die Vertrauensstellung von ROOT bis Serverzertifikate.
# Der Server liefert in der Regel die Zwischenzertifikate mit, denen vertraut werden muss. Lediglich das ROOT Zertifkat
# muss beim Client vorhanden sein.

CA_FILE="/etc/ssl/certs/ca-certificates.crt"
CA_PATH="/etc/ssl/certs/"

# Die eingelesene Zertifikatskette muss in sortierter Reihenfolge vorliegen!!!
# Folgende Reihenfolge ist dabei zu beachten: "Serverzertifikate --> Zwischenzertifikat(e) --> Root"
cat "$@" | \
    sed '/BEGIN/i@' | \
    tac | \
    while read -d"@" CERT
    do
        C_CERT=$(echo "$CERT" | tac)
        CN=$(echo "$C_CERT" | openssl x509 -noout -subject | sed 's/^.*CN=//')
        if [ -z "$CERTS" ]
        then
            # Prüfe Root Zertifikate
            RET=$(echo "${C_CERT}" | openssl verify -verbose -CApath $CA_PATH -x509_strict 2>&1)
        else
            # Prüfe weitere Zertifikate gegen Root bzw. Zwischenzertifikate/Root
            RET=$(echo "${C_CERT}" | openssl verify -verbose -CAfile <(echo -e "$CERTS") -CApath $CA_PATH -x509_strict 2>&1)
        fi
        # Save certificates as we progress, to be used in CAfile
        CERTS="${CERTS}\n${C_CERT}"
        echo "$RET - CN $CN"
    done
