Skip to main content

Signatur-Algorithmen einer Zertifikatskette anzeigen

Da mit SHA1 signierte Zertifikate inzwischen als unsicher eingestuft werden, habe ich nach einer einfachen Möglichkeit gesucht, wie ich herausfinden kann, welche meiner Zertifikate davon betroffen sind.

Es reicht allerdings nicht, nur das Serverzertifikat auszutauschen. Es sollte auch die Zertifikatskette (Certificate chain) untersucht werden, da ggf. auch das Zwischen- und CA-Zertfikat ausgetauscht werden muss. Wobei das CA-Zertifikat natürlich nur von der CA, bzw. dem Herausgeber selbst (Geotrust, Thawte, etc) ausgetauscht werden kann.

Aufgerufen wird das Script so (kann dann z.B. in einer Schleife mit euren verschiedenen Servern/Ports gefüttert werden):

# ./check-ssl-chain.sh www.heise.de:443
    Signature Algorithm: sha256WithRSAEncryption
        Subject: C=DE, ST=Niedersachsen, L=Hannover, O=Heise Zeitschriften Verlag GmbH und Co KG, OU=Netzwerkadministration, CN=www.heise.de
    Signature Algorithm: sha256WithRSAEncryption

    Signature Algorithm: sha256WithRSAEncryption
        Subject: C=US, O=thawte, Inc., CN=thawte SHA256 SSL CA
    Signature Algorithm: sha256WithRSAEncryption

oder:

# ./check-ssl-chain.sh google.com:443
    Signature Algorithm: sha1WithRSAEncryption
        Subject: C=US, ST=California, L=Mountain View, O=Google Inc, CN=google.com
    Signature Algorithm: sha1WithRSAEncryption

    Signature Algorithm: sha1WithRSAEncryption
        Subject: C=US, O=Google Inc, CN=Google Internet Authority G2
    Signature Algorithm: sha1WithRSAEncryption

    Signature Algorithm: sha1WithRSAEncryption
        Subject: C=US, O=GeoTrust Inc., CN=GeoTrust Global CA
    Signature Algorithm: sha1WithRSAEncryption

Das Beispiel 1 (Heise) zeigt, dass der Admin fleissig war und die Zertifikate schon gegen SHA256-signierte ausgetauscht hat. Google hingegen setzt noch mit SHA1 signierte Zertifikate ein.

Hier noch das Script:

#!/bin/sh
 
HOST=$1
TMP=`mktemp -d`
 
echo QUIT | openssl s_client -showcerts -connect $HOST 2>/dev/null | sed -ne '/BEGIN CERT/,/END CERT/p' | awk -v TMP="$TMP" '/BEGIN/{n++}{print >TMP"/out" n ".crt" }'
 
for i in `ls $TMP/out*`; do
  openssl x509 -in $i -noout -text | egrep "Signature Algorithm|Subject:"
  echo
done
 
rm -rf $TMP