Aggiornamento Certificati pfsense da linea di comando

Aggiornamento Certificati pfsense da linea di comando

Buongiorno a tutti, mi sono recentemente imbattuto in una problematica riguardante i certificati generati con letsencrypt.

Capita spesso di avere un webserver su una macchina esposta ad internet che svolga la funzione di proxy per proteggere dei servizi in esecuzione su macchine all’interno della rete aziendale protetta. In questo caso l’host su cui è in esecuzione il webproxy (esposto ad internet) dovrà occuparsi di aggiornare i certificati ogni 90 giorni. Le macchine interne, a valle cioé del proxy, dovranno acquisire il certificato aggiornato direttamente dall’host su cui è in esecuzione il webproxy.

In questo articolo vedremo come sarà possibile, attraverso uno script, aggiornare il certificato web di un host pfsense in automatico.

Normalmente basterebbe effettuare un rsync della cartella /etc/letsencrypt tra le macchine ed il gioco è fatto (magari scrivendo un opportuno script). Ma nel caso di pfsense la cosa è un po’ più complicata.

Partendo da un articolo presente sul forum netgate (che riporto qui) ho preparato uno script che farò al caso vostro.

Lo script sarà da eseguire sulla macchina in cui è in esecuzione il webproxy e che si occuperà di aggiornare i certificati.

Requisiti:

  1. Tale macchina dovrà poter accedere via ssh all’host pfsense senza password usando le chiavi SSH. Questa procedura non è oggetto della guida ma se cercate in rete troverete molti articoli che vi permettono di ottenere questo scopo.
  2. Dovrà esistere un certificato creato tramite webconfigurator in pfsense con un nome ben preciso (nel caso dello script si chiama letsencrypt ma potete personalizzarlo a patto che nome e parametro keyname dello script combacino)
  3. Personalizzare lo script con i parametri propri del vostro sistema, in particolare:

host='PFSENSE_IP'
username="root"
cert_path="/etc/letsencrypt/live/HOSTNAME"
privatekey="privkey.pem"

Lo script estrae dall’host pfsense il file xml di configurazione, cerca al suo interno la coppia certificato-chiave associata all’id letsencrypt e verifica che sia analogo all’ultimo certificato ottenuto. Se così non è aggiorna il file config.xml e lo inetta nuovamente nell’host pfsense riavviando il server web.

#!/bin/bash

# Parameters
host='PFSENSE_IP'
username="root"
cert_path="/etc/letsencrypt/live/HOSTNAME"
keyname="letsencrypt"
certificate="cert.pem"
privatekey="privkey.pem"

# Certificate and Key Preparation
cert=$(base64 $cert_path/$certificate)
cert=$(echo $cert | sed "s/ //g")
key=$(base64 $cert_path/$privatekey)
key=$(echo $key | sed "s/ //g")

# Moving into temp dir
cd /tmp

# Download Configuration
scp $username@$host:/conf/config.xml config.xml

# Extraction old cert and kay from configuration
oldcertificate=$(grep -A2 -P $keyname config.xml | awk '/<crt>/ { print $1}' | sed "s|<crt>||g" | sed "s|</crt>||g")
oldprivatekey=$(grep -A2 -P $keyname config.xml | awk '/<prv>/ { print $1}' | sed "s|<prv>||g" | sed "s|</prv>||g")

# Check if it's necessary updating certificate and key
if grep "$cert" config.xml > /dev/null
then
    echo "Identical certificate found, renewal not required"
else
    echo "Certificate not found, renewal required"
    # Replace old cert & key
    sed -i -e "s|$oldcertificate|$cert|g" config.xml
    sed -i -e "s|$oldprivatekey|$key|g" config.xml
    scp config.xml $username@$host:/conf/config.xml
    ssh $username@$host rm /tmp/config.cache
    ssh $username@$host /etc/rc.restart_webgui
fi

# Clean directory
rm config.xml

Alla prossima!

Share this content: