PfSense - ACME-Zertifikate auf anderen Server kopieren
Aus znilwiki
Changelog:
- 15.06.2024 erste Version
Vorwort
Ich liebe den pfSense ACME-Service (im Package Manager installierbar).
In diesem kann ich bequem den Abruf von Zertifikaten auch per DNS-Challange und über die IONOS-API einrichten.
Auf Wunsch werden die Zertifikate auch noch mal separat im Ordner
/conf/acme
auf der pfSense gespeichert um diese auch woanders verwenden zu können.
Am einfachsten an diese Zertifikate heran zu kommen, ist diese zu pushen, also von der pfSense aus automatisch auf das andere System kopieren zu lassen.
Das Erstellen der zusätzlichen Zertifikatsdateien aktivieren
Wir aktivieren den Punkt Write Certificates:
SSH Key erzeugen
Wir melden uns per SSH an der pfSense an (Benutzer admin):
und wählen Option 8.
Dann geben wir den Befehl
ssh-keygen ein, die Passphrase lassen wir leer:
Nun können wir uns den Public Key anzeigen lassen:
cat /root/.ssh/id_rsa.pub
Die Ausgabe kopieren wir uns in die Zwischenablage.
Wir Melden uns am Zielsystem per SSH an - mit dem Benutzer unter dem die Dateien abgelegt werden sollen - und bearbeiten die Datei
nano ~/.ssh/authorized_keys2
dort fügen wir den zuvor kopieren Schlüssel in einer neuen Zeile ein und speichern die Datei.
Das testen wir nun indem wir uns von der pfSense aus an diesem Server anmelden. Beim allerersten mal fragt er ob der Fingerprint gespeichert werden soll - was wir bejahen:
Wenn Ihr euch einmal mit exit
wieder trennt und noch mal neu verbindet sollte es ohne Nachfrage geschehen.
Kopieren testen
Auf dem Zielsystem müsst Ihr den gewünschten Zielpfad anlegen, dazu also per SSH am Zielsystem angemeldet sein!
mkdir -p /pfsensemeisenweg1/acme/
Nun können wir von der pfSense aus testen ob wir die Dateien dorthin schieben können:
scp -r -i /root/.ssh/id_rsa /conf/acme root@192.168.1.2:/pfsensemeisenweg1/
Die Parameter:
scp : der Kopierbefehl -r : Rekursiv, also inklusive eventueller Unterverzeichnisse -i /root/.ssh/id_rsa : Benutze zur Anmeldung folgenden privaten Schlüssel /conf/acme : Quellordner der kopiert werden soll (also dessen Inhalt) root@ : Benutzer auf dem Zielsystem 192.168.1.2: : DNS-Name oder IP des Zielsystems, gefolgt von einem : /pfsensemeisenweg1/ : Zielpfad (unterhalb dessen der Quellordner samt Dateien eingefügt wird)
Der Befehl überschreibt jedes mal, löscht aber nichts!
Befehl bei den Zertifikatsanforderungen hinterlegen
Unter
Service => Acme Certificates => Certificates
sehen wir die einzelnen Zertifikatsanforderungen.
Ganz unten bei einer Anforderung gibt es die Action list, dort fügen wir unseren scp Befehl als neues Shell Command ein:
Das kopieren wird nun jedes mal ausgeführt wenn das Zertifikat erneuert wurde.
Nicht alle sondern nur ein bestimmtes Zertifikat kopieren
Um nur ein Zertifikat zu kopieren könnte Ihr den Befehl wie folgt abwandeln:
scp -i /root/.ssh/id_rsa /conf/acme/pfsensemeisenweg1.znil.org* root@192.168.1.2:/pfsensemeisenweg1/acme/
Also das -r
weglassen, den Namen des Zertifikates ohne die Dateiendungen, gefolgt von einem *
Diesen Befehl fügt Ihr dann statt dessen als Shell Command bei der Zertifikatsanforderung ein.
So könnte Ihr die Zertifikate auch einzeln auf verschiedene Server kopieren.
Auf dem Zielserver eine Aktion auslösen nachdem kopiert wurde
Ich kopieren in meinem Fall die Zertifikate auf einen Apache2 Webserver der dieses Zertifikate dann verwendet.
Dieser muss nach dem Kopieren einmal neu gestartet werden damit er die neuen Zertifikate übernimmt.
Das können wir wiederum als Shell Command dahinter dranhängen:
ssh -i /root/.ssh/id_rsa root@192.168.1.2 "systemctl restart apache2.service"
Das Zertifikat in ISPConfig verwenden
Ich nutze gerne ISPConfig für meine Webserver da ich so leicht eine neue Subdomäne anlegen lassen kann. Und die dann auch gleich unter einem jeweils eigenen Benutzer läuft.
In ISPConfig unter Sites in den Einstellungen der entsprechenden Domäne, auf dem reiter Domain setzen wir den Haken bei SSL:
Wer will kann auch gleich auf dem Reiter Redirect den Haken bei der Umleitung auf SSL setzen:
Auf dem Reiter SSL ganz unten stellt Ihr die SSL Action: auf Create certificate:
Wenn Ihr die Einstellungen nun speichert und warten das ISPConfig mit der Verarbeitung fertig ist (der rote Kreis mit Zahl neben dem Suchenfeld oben ist wieder verschwunden), könnte ihr wieder in die Einstellungen gehen und auf den Reiter SSL wechseln. Dort sollte dann in den Feldern für das Zertifikat etwas drin stehen:
Die Webseite sollte nun per SSL aufrufbar sein, jedoch mit dem selbst signiertem Zertifikat.
Nun meldet euch per SSH an eurem ISPConfig-Server an und gebt folgenden Befehl ein:
cat /etc/apache2/sites-available/nextcloud.znil.org.vhost | grep SSLCertificate
In diesen Fall ist nextcloud.znil.org der Name der Site die ich angelegt habe.
Der Befehl spuckt euch die Pfade zu den verwendeten Zertifikatsdateien aus:
SSLCertificateFile /var/www/clients/client0/web23/ssl/nextcloud.znil.org.crt SSLCertificateKeyFile /var/www/clients/client0/web23/ssl/nextcloud.znil.org.key SSLCertificateFile /var/www/clients/client0/web23/ssl/nextcloud.znil.org.crt SSLCertificateKeyFile /var/www/clients/client0/web23/ssl/nextcloud.znil.org.key
Zufällig gehören diese Dateien auch immer dem root:
-rw-r--r-- 1 root root 1,9K Jun 16 15:39 /var/www/clients/client0/web23/ssl/nextcloud.znil.org.crt -rw-r--r-- 1 root root 1,7K Jun 16 15:39 /var/www/clients/client0/web23/ssl/nextcloud.znil.org.csr -r-------- 1 root root 3,2K Jun 16 15:39 /var/www/clients/client0/web23/ssl/nextcloud.znil.org.key
Um die Zertifikate einzubinden stehen und nun 3 Möglichkeiten zur Verfügung, alle haben Ihre Vor- und Nachteile.
Bei allen Varianten muss der Apache2 einmal neu gestartet werden wenn die Zertifikate ausgetauscht wurden.
Variante 1: Überschreiben
Wir überschreiben die Dateien mit den von der pfSense gelieferten Daten:
cp /pfsensemeisenweg1/acme/Wildcard_Meisenweg.key /var/www/clients/client0/web23/ssl/nextcloud.znil.org.key cp /pfsensemeisenweg1/acme/Wildcard_Meisenweg.crt /var/www/clients/client0/web23/ssl/nextcloud.znil.org.crt
Das müssen wir dann aber jedes mal machen, also in die Action-Liste der Zertifikatsanfordern auf der pfSense mit aufnehmen!
Solange Ihr das Zertifikat in den ISPConfig-Einstellungen der Site nicht verändert (also bei der SSL-Action es immer auf none stehen lasst, sollte es auch nicht überschrieben werden.
Variante 2: Verlinken
Wir löschen die beiden Dateien:
rm /var/www/clients/client0/web23/ssl/nextcloud.znil.org.key /var/www/clients/client0/web23/ssl/nextcloud.znil.org.crt
und ersetzen diese mit einem Link auf die Dateien von der pfSense:
ln -s /pfsensemeisenweg1/acme/Wildcard_Meisenweg.key /var/www/clients/client0/web23/ssl/nextcloud.znil.org.key ln -s /pfsensemeisenweg1/acme/Wildcard_Meisenweg.crt /var/www/clients/client0/web23/ssl/nextcloud.znil.org.crt
Hinterher sieht das Verzeichnis dann so aus:
insgesamt 12K drwxr-xr-x 2 root root 4,0K Jun 16 15:56 ./ drwxr-xr-x 11 root root 4,0K Jun 16 15:33 ../ lrwxrwxrwx 1 root root 46 Jun 16 15:56 nextcloud.znil.org.crt -> /pfsensemeisenweg1/acme/Wildcard_Meisenweg.crt -rw-r--r-- 1 root root 1,7K Jun 16 15:39 nextcloud.znil.org.csr lrwxrwxrwx 1 root root 46 Jun 16 15:55 nextcloud.znil.org.key -> /pfsensemeisenweg1/acme/Wildcard_Meisenweg.key
Ich habe hier symbolische Links gewählt weil man dann sehen kann wo das Original liegt, man hätte auch harte Links nehmen können (das -s>/code> weglassen).
Solange Ihr das Zertifikat in den ISPConfig-Einstellungen der Site nicht verändert (also bei der SSL-Action es immer auf none stehen lasst, sollte es auch nicht überschrieben werden.
Variante 3: Die .vhost Datei ändern
Ihr ersetzt in der .vHost Datei der Webseite die Pfade zum Zertifikat:
SSLCertificateFile /var/www/clients/client0/web23/ssl/nextcloud.znil.org.crt
SSLCertificateKeyFile /var/www/clients/client0/web23/ssl/nextcloud.znil.org.key
ersetzen durch
SSLCertificateFile /pfsensemeisenweg1/acme/Wildcard_Meisenweg.crt
SSLCertificateKeyFile /pfsensemeisenweg1/acme/Wildcard_Meisenweg.key
Nachteil ist, das wenn Ihr etwas in den Site-Einstellungen unter ISPConfig ändert, wird diese Änderung auch jedes mal überschrieben.
Windows Server als Ziel
Wenn es sich um mindestens Windows Server 2019 handelt, könnt Ihr die Dateien auch dorthin kopieren.
OpenSSH Server aktivieren
Auf dem Windows-Server geht Ihr auf
Einstellungen => Apps => Optionale Features verwalten
bzw. bei Server 2022 auf
Einstellungen => Apps => Optionale Features
Im Dialog danach wählt Ihr
Feature hinzufügen
und wählt aus der Liste den OpenSSH-Server:
Sobald dieser Installiert ist, ruft die die Dienste auf, sucht den Dienst und stellt diesen um auf "Automatischer Start" und startet diesen auch gleich:
Public Key hinterlegen
Im Profil des Benutzers den Ihr für die Anmeldung verwenden wollt erstellt Ihr den Ordner
C:\Users\Manfred\.ssh
Wenn das über den Dateiexplorer nicht geht so macht es per CMD.
mkdir C:\Users\Manfred\.ssh
dort erstellt Ihr die Textdatei
authorized_keys
(ohne Dateiendung!) und kopiert wieder den Inhalt aus der id_rsa.pub hinein (wie beim Linux Rechner aus).
Weitere Informationen dazu findet Ihr unter:
Zugriff Testen
von der pfSense aus:
ssh -v -i /root/.ssh/id_rsa ZNIL\\manfred@192.168.128.91
Versucht es als Benutzer
ZNIL\MANFRED
Ja, in der Befehlszeile müsst Ihr 2x \ einfügen. Alternativ könntet Ihr auch
ssh -v -i /root/.ssh/id_rsa manfred@znil.local@192.168.128.91
schreiben.
Ihr solltet in einer Eingabeaufforderung landen, Wiederum müsst Ihr einmalig den Host-Key akzeptieren
Bei Problemen:
Auf der Seite der pfsense könnte ihr den ssh-Befehl um ein
-v
ergänzen, dann erzählt er mehr, auf der Server Seite könnte Ihr den OpenSSH Dienst beenden und in einer Eingabeaufforderung
sshd -d
starten. Nach jeder Verbindung oder Fehler beendet sich der manuell gestartete Server auf der Windows Seite aber wieder und muss neu gestartet werden.
Hilfreich ist gerade das Serverlog, da könnt Ihr dann auch sehen in welchen Dateien er es probiert.
Dateien kopieren
scp -i /root/.ssh/id_rsa /conf/acme/pfsensemeisenweg1.znil.org* ZNIL\\manfred@192.168.128.91:/C:/acme/
kopiert in diesem Fall die Dateien des einen Zertifikates nach
C:\acme
Befehl unter Windows ausführen lassen
Um unter Windows z.B. einen Dienst neu zu starten:
ssh -i /root/.ssh/id_rsa ZNIL\\manfred@192.168.128.91 "net stop spooler && net start spooler"
startet die Druckwarteschlange neu (Benutzer muss Admin-Rechte haben),
ssh -i /root/.ssh/id_rsa ZNIL\\manfred@192.168.128.91 "C:\acme\test.cmd"
startet das Skript
C:\acme\test.cmd
Quellen
Inspiriert von: https://victorlclopes.medium.com/copy-pfsense-acme-certificate-to-another-server-e42c611c47ec
Ich habe abgewandelt das entweder alle Zertifikate kopiert werden (so kann man den Befehl einfach bei jedem Zertifikat gleich einfügen) oder im 2. Beispiel alle 5 Dateien eines Zertifikates (und nicht nur 3).
Kommentare
Loading comments...