Scripti, joka tarkastaa, onko Multi-Domain-varmenne asennettu kaikkiin osoitteisiin joita se suojaa

11.6.2018

hand_script_700x400

En ole scriptaaja tai koodaaja, enkä ole koskaan suuremmin edes pitänyt koodaamisesta, johtuen siitä, että en ole kovinkaan hyvä siinä. Oli kuitenkin pakko tarttua ”härkää sarvista”, kun asiakkaallamme oli pulma, josta ajattelin, että sen voisi ratkaista pienellä OpenSSL:ää hyödyntävällä scriptillä.

Asiakkaallamme on käytössä Multi-Domain-varmenne, jossa on verrattain suuri määrä SANeja. Webbisivut, joita varmenteella suojataan, ovat useammalla eri alustalla, ja aina kun varmenne uusitaan tai siihen lisätään SANeja, varmenne pitää jaella ja ottaa käyttöön kaikilla alustoilla/osoitteilla uudestaan. Heillä oli ongelmana se, ettei ollut järkevää tapaa varmistaa uuden/uusitun varmenteen asennusta tarvittaville alustoille.

harri@Ubuntu-VirtualBox:/etc/ssl$ openssl s_client -connect...

Kun kävimme asiakkaamme kanssa keskustelua, heitin ylimalkaisesti, että tämän asian voisi ratkaista OpenSSL:llä ja pienellä scriptinpätkällä, jonka joku osaava koodari tekisi varmaan aika nopeasti. Asia jäi hautumaan takaraivooni ja eräänä päivänä käynnistin virtuaalikoneen ja aloin scriptaamaan. OpenSSL:n komennot osaan ja muistan suhteellisen hyvin, koska käytän sitä melkein päivittäin. Mutta scriptaaminen tarkoittaa minulle sitä, että otan rinnalle auki Googlen ja alan hakemaan esimerkkejä ja vinkkejä eri keskustelufoorumeilta siitä, kuinka scripti kannattaisi tehdä. Sainkin scriptin perusosat kasaan melko helposti, mutta nälkä kasvaa syödessä ja halusin lisätä scriptiin automatiikkaa sekä sen, että kuka tahansa voisi käyttää sitä.

Multi-Domain-varmenteen SAN-listan tarkastava scripti – versio 1.0

Lopputuloksena kasassa on Multi-Domain-varmenteen SAN-listan tarkastava scripti – versio 1.0. Scripti kysyy käyttäjältä ns. base-URLin (esim. wesentra.com), jonka varmenteen sarjanumero ja  SAN-lista luetaan OpenSSL:n avulla. Kyseisen SAN-listan osoitteiden varmenteiden sarjanumeroita verrataan jälleen kerran OpenSSL:llä base-URLin varmenteen sarjanumeroon. Jos sarjanumerot eivät vastaa toisiaan, niin scripti kertoo sen. Silloin voi päätellä, että sama varmenne ei ole asennettuna kuin base-URLin osoitteessa.

Kuten jo alussa mainitsin, että en ole koodaaja/scriptaaja, joten en anna scriptin toiminnalle ja käyttämiselle minkäänlaista takuuta. Olen testannut scriptiä itse kuitenkin sen verran, että se toimii varmasti vähintäänkin alustavana tsekkinä sen jälkeen, kun Multi-Domain-varmenne on uusittu tai siihen lisätään SANeja ja se pitää asentaa uudestaan.

Tässä scripti, olkaa hyvä 🙂 Alla vielä muutama huomio, jotka on hyvä tietää ennen scriptin ajamista:

  • koodi ei ole optimaalista ja scripti ”hyytyy” (OpenSSL:n timeout on pitkä…) aika herkästi, jos esim. SAN-listalla on osoitteita, joita ei tavoiteta tai jos niillä ei ole https päällä
  • scripti on kirjoitettu bash-versiolla GNU bash, version 4.3.48 ja OpenSSL:stä minulla on käytössä versio OpenSSL 1.0.2g (toimii todennäköisesti muillakin versioilla, mutta en ole testannut)
#!/bin/bash

#Script to check if the same certificate is installed on all addresses listed in the certificate's SAN list
#Version 1.0 11.4.2018 Harri Tuuva Wesentra Oy
#THE SCRIPT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND

#clear screen
echo $(clear)

GREEN='33[0;32m'
WHITE='33[1;37m'
RED='33[0;31m'

#prompting the base URL which sets the baseurl variable
read -p "Insert base URL from where to get the certificate serial to compare against (e.g. wesentra.com): " baseurl
printf "n"

echo -e "##########################################################################################"
echo -e "Script compares ${GREEN}" $baseurl "${WHITE} site's certificate's serial to all certificate serials that are"
echo -e "listed in the base certificate's SAN list"
echo -e "If serials match then OK! If serials don't match then the same serticate is not installed."
echo -e "##########################################################################################"
printf "n"

sleep 2

read -p "Press any key to continue... " -n1 -s

# setting the baseserial variable
baseserial=$( echo | openssl s_client -servername $baseurl -connect $baseurl:443 2>/dev/null | openssl x509 -noout -serial )

# setting the base notbefore variable = Certificate issue date/time
notbefore=$( echo | openssl s_client -servername $baseurl -connect $baseurl:443 2>/dev/null | openssl x509 -noout -dates |grep notBefore | cut -d "=" -f 2- )

printf "n"

echo "The serial under comparison is: "$baseserial
echo "Compared certificate is issued " $notbefore

printf "n"

read -p "Press any key to continue... " -n1 -s

printf "n"

# listing SANs from the baseurl certificate to a file called SANS.txt
echo|openssl s_client -servername $baseurl -connect $baseurl:443 2>/dev/null | openssl x509 -noout -text | grep "Subject Alternative Name" -A2 | grep -Eo "DNS:[a-zA-Z 0-9.*-]*" | sed "s/DNS://g" > SANS.txt

#while loop reads SANS.txt file line by line and sets san variable
while read -r san
do

printf "n"
#fetching the serial of the site being compared and putting it in tempserial.txt file
echo | openssl s_client -servername $san -connect $san:443 2>/dev/null | openssl x509 -noout -serial > tempserial.txt
 read tempserial < tempserial.txt #setting tempserial variable by reading it from file
 if [[ "$tempserial" == "$baseserial" ]] #comparing base URL serial and SAN serial
 then echo -e $san $tempserial "${GREEN}matches with${WHITE}" $baseserial #if match then OK
 else echo -e $san $tempserial "${RED}!!DOES NOT MATCH WITH!!${WHITE}" $baseserial #if doesn't match then the same cert is not installed
 fi

done < SANS.txt

Jos käytät scriptiä, niin olisin kiitollinen, jos voisit antaa kokemuksia ja/tai parannusehdotuksia, harri.tuuva@wesentra.com

Lue lisää