colinardo
Goto Top

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

back-to-topEinleitung

Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal auf SSL umstellen wollte (Sollte ja heute Pflichtprogramm sein). Nötig dafür ist natürlich ein gültiges Zertifikat so dass bei den Usern keine Warnungen aufpoppen. Da ein kostenpflichtiges Zertifikat nicht in Frage kam, dachte ich mir, lösen wir es mit Let's Encrypt Zertifikaten. Problem: Mikrotik bietet keine Möglichkeit solche Zertifikate automatisiert zu erneuern und alle 3 Monate manuell erneuern geht ja gar nicht face-smile. Also dachte ich mir, ran an ans Werk und nachrüsten. Natürlich kann man das Generieren der Zertifikate auch auf andere Systeme auslagern(Cloud/Azure/AWS/Raspi) und nur die Zertifikate am Mikrotik downloaden lassen, aber hier ging es vornehmlich darum, das Ganze ohne weitere zusätzlich Strom fressenden Systeme gänzlich allein auf dem Router zu realisieren.

In den nachfolgenden Punkten erläutere ich euch die notwendigen Schritte um ein Let's Encrypt Zertifikat abzurufen und in den Speicher des Mikrotik zu importieren um es anschließend in den Hotspot einzubinden. Grundsätzlich ist der Ablauf folgender:
  • Anlegen einer METARouter-Instanz
  • Anpassen der Instanz mit den nötigen Tools
  • Erzeugen von SSH-Keys für den automatisierten Login auf den Webspace und dem Mikrotik (Zur Verifizierung bei Let's Encrypt wird der Webspace der Domain für welche das Zertifikat erzeugt werden soll temporär per SSHFS eingebunden.)
  • Einfügen eines Skripts zur Erneuerung des Zertifikats
  • Skript in den Autostart der Instanz einfügen, so dass es beim Booten automatisch gestartet wird
  • Skript kopiert erzeugtes Zertifikat und privaten Schlüssel per SCP zurück in den Speicher des Mikrotik.
  • Ein Mikrotik-Skript startet dann das ganze und lässt sich via Scheduler z.B. alle 60 Tage für die Verlängerung des Zertifikats ausführen

In diesem Beispiel erneuere ich das Hotspot-Zertifikat. Das Mikrotik-Script kann natürlich jeder auf seine Bedürfnisse anpassen, wenn z.B. das Zertifikat für eine andere Komponente auf dem Mikrotik verwendet werden soll.

back-to-top1. Hinweise

Da die Anleitung das Feature MetaROUTER des Mikrotik verwendet kommen folgende Geräte in Frage
https://wiki.mikrotik.com/wiki/Manual:Metarouter
Currently MetaRouter can be used on

RB400, RB700 series except models with SPI flash, RB900 series except models with SPI flash, RB2011 boards
Listed PPC boards: RB1000, RB1100, RB1100AH and RB800.
Euer Mikrotik sollte genügend freien RAM (für die METARouter Instanz ca. 16-32MB) und NAND-Speicher haben.
Als Spielwiese kam ein RB951G-2HnD mit 128MB RAM und 128MB Speicher zum Einsatz.
Die Instanz begnügt sich normalerweise mit sehr wenig RAM (ca. 10MB), bei Bedarf lässt sich sich auch noch weiter abspecken, aber das lass ich euch face-wink.

back-to-top2. Meta-ROUTER Image herunterladen und installieren

  • Für die MIPS Architektur dieses OpenWRT Image herunterladen (Für andere Architekturen müsst Ihr euch ein eigenes Image bauen):
  • http://download.bmsoft.de/mikrotik/12.09/metarouter/mr-mips/openwrt-mr- ...
  • Das Archiv so wie es ist in den Speicher des Mikrotik kopieren (Drag n' Drop in die Winbox / SFTP / FTP)
  • Nun erstellen wir einen neuen Meta-ROUTER mit dem Image (Bitte das Häkchen bei enable raus nehmen, da wir vor dem Start der VM erst noch ein Netzwerkinterface hinzufügen müssen)

screenshot

Alternativ als Shell-Befehl:
/metarouter import-image file-name=openwrt-mr-mips-rootfs.tar.gz memory-size=32 enabled=no


  • Jetzt benötigen wir ein Netzwerk-Interface für die Instanz

Folgende Einstellungen vornehmen:

Virtual-Machine: <Bitte aus dem Dropdown auswählen>Type: DynamicDynamic-MAC-Address: <wird vom Mikrotik generiert, kann bei Bedarf geändert werden>Bridge-Interface: <Das Bridge-Interface wählen welchem dieses Interface dynamisch hinzugefügt wird>VM MAC-Address: <wird vom Mikrotik generiert, kann bei Bedarf geändert werden>

screenshot

Alternativ als Shell-Befehl:
/metarouter interface add virtual-machine=[/metarouter find] dynamic-bridge=<BRIDGE INTERFACE> type=dynamic


Damit ist die Instanz zum ersten Start bereit.

back-to-top3. Anpassen der Meta-ROUTER Instanz


Los geht's. Starten der Instanz:

screenshot

Alternativ als Shell-Befehl:
/metarouter enable MR1
/metarouter console MR1

Die Instanz startet nach dem Aktivieren automatisch und wird euch in der Spalte "Status" als "running" signalisiert.
Die Konsole des Meta-ROUTER erreicht ihr nun über das Kontextmenü > "Console", oder über den oben gezeigten Shell-Befehl. Drückt darin einmal ENTER um die Shell zu aktivieren.

screenshot

Als erstes solltet ihr euch nun davon überzeugen das die Netzwerkkarte der Instanz Netzzugang hat (Wenn ihr eine statische IP bevorzugt, könnt ihr das in der Datei /etc/config/network nachholen).
Dazu ein ifconfig eintippen, ein route sollte das Default Gateway listen und ein Ping an eine Internetadresse sollte erfolgreich sein.

screenshot

Nun fehlen uns noch einige Tools und Einstellungen. Ich habe der kürze halber der nötigen Befehle hier im Kasten zusammengefasst und jeweils kommentiert
# disable firewall and dropbear ssh agent
/etc/init.d/firewall stop && /etc/init.d/firewall disable
/etc/init.d/dropbear stop && /etc/init.d/dropbear disable
# load current package list
opkg update
# remove dropbear ssh client (we use openssh client instead)
opkg remove dropbear
# install needed packages
opkg install wget openssh-client openssl-util sshfs openssh-keygen
# make wget globally ignore certificates
echo "check_certificate = off" >>~/.wgetrc
# download acme.sh and install(ignore warning about missing 'socat', it's not needed.
wget -O - https://get.acme.sh | sh

In meinem Beispiel hat ist der Webspace per SSH/SCP erreichbar welchen wir nun in ein Verzeichnis in der Instanz mounten wollen. Damit das in der Zukunft natürlich automatisch ohne Passworteingabe passiert erzeugt ihr euch ein Keypair, gängige Praxis die ich euch sicherlich nicht nochmal detailliert vorbeten muss, oder face-wink.
Kurzfassung:
ssh-keygen -t rsa
eingeben und alle Eingaben mit Enter bestätigen (kein Passwort für den Schlüssel vergeben!).
Den Inhalt des PublicKeys (/root/.ssh/id_rsa.pub) solltet ihr nun auf dem Webspace in die Datei ~/.ssh/authorized_keys kopieren. Abschließend testet ihr den Zugang zum Webspace mit
ssh user12345@sftp.mywebspace.de
Ein Login sollte dann ohne Passwortabfrage erfolgen.

Das gleiche brauchen wir für den Transfer der nach generierten Zertifikate auf den Mikrotik. Für diese Aufgabe erzeugt man besten einen extra User am Mikrotik dem man dann den generierten Public-Key importiert. Anleitung dazu siehe:
https://jcutrer.com/howto/networking/mikrotik/routeros-ssh-publickeyauth ...
(ACHTUNG: Damit ihr euch nicht vom Mikrotik ausperrt wenn Ihr den Private-Key nicht aus dem Meta-ROUTER gesichert habt, achtet darauf das ihr den Key nicht dem admin zuweist denn sonst kommt ihr ohne Key-Auth nicht mehr auf den Mikrotik) -Anmerkung der Redaktion:-> Oh, ja ist mir selbst auch schon passiert face-big-smile, hatte die Keys aber gesichert und brauchte somit kein Backup zurückspielen.

Jetzt erstellen wir das Skript welches das Zertifikat bei Let's Encrypt abruft und auf den Mikrotik transferiert.
Dazu eine leere Datei erstellen mit
vi /root/generate_certificate
Nun i drücken und folgendes Skript einfügen:
Dabei gibt es diese Variablen die es an eure Umgebung anzupassen gilt:

DOMAIN = <COMMON-NAME des Zertifikats das erzeugt werden soll>WEBROOT = <Das lokale Verzeichnis in welchem wir den Webspace temporär mounten (Dient zur Verifikation von Let's Encrypt)>WEBSPACE = <Benutzerkennung und Host eures Webspace>MIKROTIKSSHHOST = <Benutzerkennung und Host/IP unter der der Mikrotik per SSH seinen Speicher zur Verfügung stellt>MAXWAITINET = <Zeit in Sekunden wie lange das Skript max. auf eine Internetverbindung wartet.>

#!/bin/sh
# BEGIN VARS
DOMAIN=hotspot.domain.de
WEBROOT=/root/webroot
WEBSPACE=u123456@data.host:/
MIKROTIKSSHHOST=script@10.10.1.1:/
MAXWAITINET=120
# END VARS

# check Internet-Connection
TRIES=0
while ! ping -c 1 google.de >/dev/null 2>&1 ;do   
	if [ $TRIES -ge $MAXWAITINET ] ;then
	    logger "ERROR, NO INTERNET!"  
            echo "ERROR, NO INTERNET!"  
	    exit
    fi
    TRIES=$(($TRIES + 1))
    sleep 1
done

logger "### START generating certificates ###"  
# create webroot mount directory
mkdir "$WEBROOT" 2>/dev/null  
# unmount if already mountet
umount "$WEBROOT" 2>/dev/null  
# mount  webspace root to local directory
sshfs "$WEBSPACE" "$WEBROOT" -o allow_root  
# renew certificate
/root/.acme.sh/acme.sh --issue --webroot "$WEBROOT" -d $DOMAIN --force --log --log-level 2  
if [ $? -ne 0 ] ;then
  logger "Error generating certificates with Let's Encrypt, please check '/root/.acme.sh/acme.sh.log'"  
  exit 1
fi
# scp certificate and key to Mikrotik
scp /root/.acme.sh/${DOMAIN}/${DOMAIN}.cer /root/.acme.sh/${DOMAIN}/${DOMAIN}.key $MIKROTIKSSHHOST
# unmount webspace
umount "$WEBROOT"  
logger "### END generating certificates ###"  
Nun drückt in VIM ESC und abschließen schreibt :wq! zum Speichern des Skripts.
Jetzt noch ausführbar machen mit
chmod +x /root/generate_certificate
Das Mounten des Webspace (sshfs) solltet ihr vorher erst mal manuell testen, genauso wie das Verbinden mit dem Mikrotik-Speicher (via ssh oder scp). Das muss nun alles ohne Passworteingabe funktionieren, wenn nicht müsst ihr das erst beheben bevor ihr hier weiter macht.

Damit das Skript beim Booten der Meta-ROUTER Instanz automatisch startet fügen wir in die Datei /etc/rc.local vor dem exit 0 noch folgende Zeile ein:
/root/generate_certificate

Sollte nun soweit alles geklappt haben könnt Ihr des Skript das erste mal testen und es mit einem
/root/generate_certificate
starten. Hat alles geklappt findet Ihr die Zertifikate einmal in der Instanz selbst unter /root/.acme.sh/<COMMON-NAME>, und im Root des Mikrotik -Speichers abgelegt. Erst wenn das erfolgreich war fahrt ihr weiter mit der Anleitung fort.

back-to-top4. Mikrotik-Skript zum installieren der Zertifikate anlegen

Jetzt verlassen wir die Instanz des Meta-ROUTER erst mal mit exit (Fenster könnt ihr dann schließen), und arbeiten weiter in Winbox.
Das nächste Mikrotik-Skript erledigt nun nachstehende Aufgaben
  • Starten des Meta-Routers
  • Importieren der Zertifikate in den Zertifikate-Speicher des Mikrotik
  • Aktualisieren Hotspot-Profils
  • Stoppen des Meta-Routers (Ein Dauerlaufen ist hier ja nicht nötig).
Das Skript hat folgende Variablen die angepasst werden müssen:
COMMONNAME = <Common-Name eures Zertifikats>HOTSPOTPROFILE = <Der Name des zu aktualisierenden Hotspot-Profils>METAROUTERNAME = <Name eures Meta-ROUTERS>MAXWAIT = <Maximale Zeit in Sekunden die das Skript auf die neu erzeugten Zertifikate wartet>
# BEGIN VARS
:local COMMONNAME "hotspot.domain.de"  
:local HOTSPOTPROFILE "hotspot_gast"  
:local METAROUTERNAME "MR1"  
:local MAXWAIT 300
# END VARS

:local TRIES 0
:local ERROR false
# start metarouter instance
/metarouter enable $METAROUTERNAME
# wait until certificates are generated and transfered from metarouter instance
:while ((([:len [/file find name="$COMMONNAME.cer"]] + [:len [/file find name="$COMMONNAME.key"]]) < 2) && !$ERROR) do={  
	if ($TRIES <= $MAXWAIT) do={
                    :set TRIES ($TRIES+1)	
                    :delay 1
	} else={
                    /log error message="Error renewing certificate, certificate was not generated in time! Please check METARouter logs."  
	            :set ERROR true
	}
}
if (!$ERROR) do={
	/certificate
	# remove old certificates
	remove [find where common-name="$COMMONNAME"]  
	# import new certificate
	import file-name="$COMMONNAME.cer" passphrase=""  
	import file-name="$COMMONNAME.key" passphrase=""  
	# update hotspot profile ssl certificate
	/ip hotspot profile set "$HOTSPOTPROFILE" ssl-certificate=[/certificate find where common-name="$COMMONNAME"]  
	# remove certificate files
	/file remove "$COMMONNAME.cer"  
	/file remove "$COMMONNAME.key"  
}
# Stop metarouter instance
/metarouter disable "$METAROUTERNAME"  
Das Skript legt ihr unter /system scripts ab und speichert es:

screenshot

Automatisch gestartet werden kann es dann wie gewohnt mit dem Scheduler (z.B. alle 60 Tage):

screenshot

back-to-top5. Schlusswort

Bei der Verifikation des Let's Encrypt Zertfikats seit ihr natürlich frei das auf DNS-Verify etc. umzustellen. Das hier war ein einfaches Beispiel bei dem der Kunden seinen Webspace und die Domain bei 1und1 hatte und da bot es sich an den Webspace per SSHFS einzubinden.
Man sieht, mit Meta-ROUTERN lässt sich eine Menge realisieren die ein Mikrotik von selbst nicht anbietet. Auch ganz nützlich z.B. ist eine Asterisk Instanz, macht z.B. eine Fritz!box dann gänzlich überflüssig beim "kleinen Kunden" face-wink.

Noch ein wichtiger Hinweis wenn ihr fleißig Zertifikate im Test erstellt und erneuert: Achtet auf die Limits von Let's Encrypt, z.B. maximal 5 Zertfikate von ein und der selben Domain pro Woche (sliding Window). Hier einzusehen:
Rate Limits - Let's Encrypt - Free SSL/TLS Certificates
Also nicht übertreiben, sonst gibt euch das Skript einen Fehler ala 429 too many requests aus face-wink.

Hoffe die Anleitung ist dem ein oder anderen von Nutzen face-smile.

Wie immer gilt: Nutzung auf eigene Gefahr.

Nun viel Spaß beim Basteln an eurem eigenen Projekt.

Grüße @colinardo

Falls euch der Beitrag gefällt, könnt ich euch auch gerne jederzeit mit einer kleinen Spende erkenntlich zeigen, wenn euch danach ist.

Content-Key: 355746

Url: https://administrator.de/contentid/355746

Printed on: June 20, 2024 at 20:06 o'clock

Member: Frank
Frank Nov 22, 2017 at 18:37:19 (UTC)
Goto Top
Klasse, danke für die Anleitung face-smile

Gruß
Frank
Member: colinardo
colinardo Nov 22, 2017 updated at 18:42:08 (UTC)
Goto Top
Gerne, nur das Apostroph bei Let's Encrypt bekomme ich leider nicht in den Titel, aber wat solls face-wink.
Mitglied: 134464
134464 Nov 22, 2017 at 18:47:10 (UTC)
Goto Top
Geil face-smile. Kann ich echt gut gebrauchen!
Das gibt wieder massig Stoff für kühle Wintertage face-smile.

Gruß @specht
Member: Vision2015
Vision2015 Nov 22, 2017 at 18:55:53 (UTC)
Goto Top
Super... face-smile

Danke für deine Mühe...

Frank
Member: aqui
aqui Nov 23, 2017 at 08:38:01 (UTC)
Goto Top
Klasse Tutorial !
Nun fehlt nur noch eine Version für das pfSense Captive Portal face-big-smile
Member: colinardo
colinardo Nov 23, 2017 updated at 09:45:10 (UTC)
Goto Top
Zitat von @aqui:
Klasse Tutorial !
Hi @aqui, freut mich das es gefällt face-smile.
> Nun fehlt nur noch eine Version für das pfSense Captive Portal face-big-smile
Zur pfSense: Das platzsparende ACME-Package das ich auch in obiger Anleitung als einfaches *.sh Skript verwende gibt es bereits als fertiges Package für die pfSense (2.3.2-p1 and later):
Siehe: https://doc.pfsense.org/index.php/ACME_package

Grüße Uwe
Member: aqui
aqui Nov 23, 2017 at 09:59:15 (UTC)
Goto Top
Stimmt, du hast Recht ! Das muss ich gleich mal testen face-wink
Member: Penny.Cilin
Penny.Cilin Nov 23, 2017 at 10:13:52 (UTC)
Goto Top
Moin und Danke @colinardo

das ist Klasse. Einen schönen Tag noch allesamt.

Gruss Penny
Member: horstvogel
horstvogel Dec 05, 2017 at 12:30:44 (UTC)
Goto Top
Hallo,
das ACME Package nutze ich schon eine ganze Zeit. Die Erneuerung des Zertifikates funktioniert. Leider habe ich das immer noch keine Lösung gefunden, wie ich die automatische Import in den Squid Reverse Proxy. Vielleicht könnt Ihr mir einen Hinweis geben.
Danke!

PfSense ACME Packages Refresh CRL im Squid Reverse Proxy
Member: colinardo
colinardo Dec 05, 2017 updated at 15:44:09 (UTC)
Goto Top
@horstvogel : Siehe meinen Kommentar dazu in deinem Thread.

Grüße Uwe