Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen
colinardo (Level 5) - Jetzt verbinden
22.11.2017, aktualisiert 02.02.2018, 7900 Aufrufe, 10 Kommentare, 13 Danke
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 nichtIn 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: Dynamic
Dynamic-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 mit
ssh 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
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 ###"
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
4. 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).
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"
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.
10 Kommentare
- LÖSUNG Frank schreibt am 22.11.2017 um 19:37:19 Uhr
- LÖSUNG colinardo schreibt am 22.11.2017 um 19:40:36 Uhr
- LÖSUNG 134464 schreibt am 22.11.2017 um 19:47:10 Uhr
- LÖSUNG Vision2015 schreibt am 22.11.2017 um 19:55:53 Uhr
- LÖSUNG aqui schreibt am 23.11.2017 um 09:38:01 Uhr
- LÖSUNG colinardo schreibt am 23.11.2017 um 10:43:09 Uhr
- LÖSUNG aqui schreibt am 23.11.2017 um 10:59:15 Uhr
- LÖSUNG Penny.Cilin schreibt am 23.11.2017 um 11:13:52 Uhr
- LÖSUNG horstvogel schreibt am 05.12.2017 um 13:30:44 Uhr
- LÖSUNG colinardo schreibt am 05.12.2017 um 16:43:10 Uhr
- LÖSUNG aqui schreibt am 23.11.2017 um 10:59:15 Uhr
- LÖSUNG colinardo schreibt am 23.11.2017 um 10:43:09 Uhr
- LÖSUNG aqui schreibt am 23.11.2017 um 09:38:01 Uhr
- LÖSUNG Vision2015 schreibt am 22.11.2017 um 19:55:53 Uhr
LÖSUNG 22.11.2017 um 19:37 Uhr
Klasse, danke für die Anleitung 
Gruß
Frank
Gruß
Frank
LÖSUNG 22.11.2017, aktualisiert um 19:42 Uhr
Gerne, nur das Apostroph bei Let's Encrypt bekomme ich leider nicht in den Titel, aber wat solls
.
LÖSUNG 22.11.2017 um 19:47 Uhr
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
LÖSUNG 22.11.2017 um 19:55 Uhr
Super... 
Danke für deine Mühe...
Frank
Danke für deine Mühe...
Frank
LÖSUNG 23.11.2017 um 09:38 Uhr
Klasse Tutorial !
Nun fehlt nur noch eine Version für das pfSense Captive Portal
Nun fehlt nur noch eine Version für das pfSense Captive Portal
LÖSUNG 23.11.2017, aktualisiert um 10:45 Uhr
Hi @aqui, freut mich das es gefällt
.
Siehe: https://doc.pfsense.org/index.php/ACME_package
Grüße Uwe
> Nun fehlt nur noch eine Version für das pfSense Captive Portal 
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
LÖSUNG 23.11.2017 um 10:59 Uhr
Stimmt, du hast Recht ! Das muss ich gleich mal testen 
LÖSUNG 23.11.2017 um 11:13 Uhr
LÖSUNG 05.12.2017 um 13:30 Uhr
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!
https://www.administrator.de/forum/pfsense-acme-packages-refresh-crl-squ ...
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!
https://www.administrator.de/forum/pfsense-acme-packages-refresh-crl-squ ...
LÖSUNG 05.12.2017, aktualisiert um 16:44 Uhr