LetsEncrypt auf Protonetboxen aktualisieren

Letsencrypt sperrt TLS-SNI Domainvalidierung

Markus Badberg IT-Spezialist, Markus Badberg

26.02.2019 21:17:24

Für Soul+ Kunden steht das neue Update bereit. Diese sollten also das offizielle Update installieren! 

https://support.protonet.info/de/news/soul-2-28-1-letsencrypt/

Wer keinen Supportvertrag bei Protonet hat und somit auch keine aktuellen Versionen bekommt, oder einfach auf Nummer sicher gehen möchte, dass seine Box auch weiterhin mit der eigenen Domain erreichbar ist, der muss den LetsEncrypt Client aktualisieren.

Dies geht auch recht einfach, da nur die Versionsnummer im Script angepasst werden muss. Zumindest um auf die Schnelle auf der sicheren Seite zu sein. Nach einem Neustart muss diese Änderung wieder vorgenommen werden!

Wir loggen uns also per SSH auf unsere Protonetbox und öffnen mit dem Editor unserer Wahl die Datei "/usr/local/bin/letsencrypt"

Das rot markierte ist der originale Eintrag. Diesen ändern wir so, dass es wie beim grün markierten aussieht.

Dazu noch den grün hinterkegten Zusatz ein paar Reihen weiter drunter.

Dann einfach das Script ausführen

/usr/local/bin/letsencrypt

Und das Zertifikat sollte sich erneuern.

#!/bin/sh
CUSTOM_DOMAIN=$(cat /etc/protonet/nodenames/custom | xargs) # xargs trims white space
if [ ! "$CUSTOM_DOMAIN" ];then
  echo "--- Error. No custom domain set. Please create /etc/protonet/nodenames/custom, insert your domain and symlink /etc/protonet/nodename to it."
  exit 1;
fi
echo "--- Custom domain $CUSTOM_DOMAIN correctly set at /etc/protonet/nodenames/custom"
# This only works with IPv4 at the moment
RESOLVE_IP=$(dig +short $CUSTOM_DOMAIN A | tail -n 1)
MY_IP=$(curl http://ident.me/)
if [ $RESOLVE_IP = $MY_IP ]; then
  echo "--- Box is reachable from the outside via $CUSTOM_DOMAIN"
else
  echo "--- Error. Box is not reachable via $CUSTOM_DOMAIN. Please set DNS records or wait till nameservers have received the update."
  exit 1;
fi
# using the Email of the first user with the role 'admin'
EMAIL=$(cd /home/protonet/dashboard/current && RAILS_ENV=production bundle exec rails runner 'puts User.where(role: "admin").first.email' | tail -n 1)
echo "--- Using $EMAIL for letsencrypt registration."
echo "--- OK! Grabbing new SSL certificate via letsencrypt";
sudo mkdir -p /etc/protonet/letsencrypt
sudo ln -s /etc/protonet/letsencrypt /etc/letsencrypt
sudo rm -rf /tmp/letsencrypt
git clone https://github.com/certbot/certbot.git /tmp/letsencrypt
cd /tmp/letsencrypt
# pinned to certbot version 0.6.0
git checkout v0.6.0
# pinned to certbot version 0.31.0
git checkout v0.31.0
# we don't want apt-get to run, we have everything needed for letsencrypt v0.6 to run
sed -i 's/apt-get update/echo/g' ./letsencrypt-auto
sed -i 's/apt-get install/echo/g' ./letsencrypt-auto
sudo sv stop /home/protonet/dashboard/shared/services/enabled/nginx
sudo service haproxy stop
./letsencrypt-auto certonly --standalone -d $CUSTOM_DOMAIN --email $EMAIL --agree-tos --force-renew --no-self-upgrade
rc=$?
if [ $rc -eq 0 ]; then
  echo "--- Successfully generated certificate.";
else
  echo "--- Error. Couldn't generate certificate via letsencrypt.";
  sudo sv start /home/protonet/dashboard/shared/services/enabled/nginx
  sudo service haproxy start
  exit $rc;
fi
if sudo test -e "/etc/letsencrypt/live/$CUSTOM_DOMAIN/fullchain.pem"; then
  echo "--- Certificate files exist.";
else
  echo "--- Error. Can't find certificate files."
  sudo sv start /home/protonet/dashboard/shared/services/enabled/nginx
  sudo service haproxy start
  exit 1;
fi
sudo mv /etc/protonet/httpd_ssl.crt /etc/protonet/httpd_ssl.crt.old
sudo mv /etc/protonet/httpd_ssl.key /etc/protonet/httpd_ssl.key.old
sudo cp /etc/letsencrypt/live/$CUSTOM_DOMAIN/fullchain.pem /etc/protonet/httpd_ssl.crt
sudo chown protonet:protonet /etc/protonet/httpd_ssl.crt
sudo chmod 0755 /etc/protonet/httpd_ssl.crt
sudo cp /etc/letsencrypt/live/$CUSTOM_DOMAIN/privkey.pem /etc/protonet/httpd_ssl.key
sudo chown protonet:protonet /etc/protonet/httpd_ssl.key
sudo chmod 0755 /etc/protonet/httpd_ssl.key
sudo sv start /home/protonet/dashboard/shared/services/enabled/nginx
sudo service haproxy start
echo "--- Enabling cron job to renew certificate once in a while."
touch /etc/protonet/letsencrypt_enabled

Die Version v0.31.0 scheint die letzte zu sein, die auf SOUL funktioniert.

Dies ist nicht "Reboot-Persistent" Nach einem Neustart der Box ist der rote Eintrag wieder drin!

 

Falls noch ein Fehler auftritt

Solltet ihr eine Fehlermeldung erhalten, die folgendes enthält:

Performing the following challenges:
http-01 challenge for protobox.mydomain.tld
Waiting for verification...
Cleaning up challenges
Failed authorization procedure. protobox.mydomain.tld (http-01): urn:ietf:params:acme:error:connection 
:: The server could not connect to the client to verify the domain 
:: Fetching http://protobox.mydomain.tld/.well-known/acme-challenge/ad7dfR-s60g3FGLD_-sA-2skG3Hd4OyDg0FG946jniM: Error getting validation data

Dann müssen noch Reste von der TLS-SNI Konfig gelöscht werden. Dies funktioniert mit folgendem Einzeiler:

sudo sh -c "sed -i.bak -e 's/^\(pref_challs.*\)tls-sni-01\(.*\)/\1http-01\2/g' /etc/letsencrypt/renewal/*; rm -f /etc/letsencrypt/renewal/*.bak"

Den Eintrag Reboot persistent machen

Dies ist auch leicht gemacht. 

Wir sind also noch per SSH angemeldet und wechseln in das Rootverzeichnis

cd /

Nun packen wir die Datei und legen sie in das local_patches Verzeichnis ab. Sollte das Verzeichnis noch nicht existieren, legen wir es an

sudo mkdir /protonet/firmware/local_patches

Existiert das Verzeichnis bereits, können wir direkt diesen Befehl ausführen:

sudo tar cvzf /protonet/firmware/local_patches/letsencrypt_latest.tar.gz usr/local/bin/letsencrypt

Nun wird bei jedem Neustart diese tar.gz Datei entpackt und die originale Datei überschrieben. Wenn man dieses wieder rückgängig machen möchte, muss man einfach die tar.gz Datei aus dem local_patches Ordner entfernen und die Box neustarten.