Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen
Inhaltsverzeichnis
Einleitung
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 . 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.
1. Hinweise
Da die Anleitung das Feature MetaROUTER des Mikrotik verwendet kommen folgende Geräte in Fragehttps://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.
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 .
2. 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)
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>
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.
3. Anpassen der Meta-ROUTER Instanz
Los geht's. Starten der Instanz:
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.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.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 .
Kurzfassung:
ssh-keygen -t rsa
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 mitssh user12345@sftp.mywebspace.de
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 , 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
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 ###"
ESC
und abschließen schreibt :wq!
zum Speichern des Skripts.Jetzt noch ausführbar machen mit
chmod +x /root/generate_certificate
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
/root/.acme.sh/<COMMON-NAME>
, und im Root des Mikrotik -Speichers abgelegt. Erst wenn das erfolgreich war fahrt ihr weiter mit der Anleitung fort.4. Mikrotik-Skript zum installieren der Zertifikate anlegen
Jetzt verlassen wir die Instanz des Meta-ROUTER erst mal mitexit
(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).
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"
/system scripts
ab und speichert es:Automatisch gestartet werden kann es dann wie gewohnt mit dem Scheduler (z.B. alle 60 Tage):
5. 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" .
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 .
Hoffe die Anleitung ist dem ein oder anderen von Nutzen .
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 355746
Url: https://administrator.de/contentid/355746
Ausgedruckt am: 23.11.2024 um 09:11 Uhr
10 Kommentare
Neuester Kommentar
Geil . Kann ich echt gut gebrauchen!
Das gibt wieder massig Stoff für kühle Wintertage .
Gruß @specht
Das gibt wieder massig Stoff für kühle Wintertage .
Gruß @specht
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
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