Aktionen

PfSense - ACME-Zertifikate auf anderen Server kopieren

Aus znilwiki

Version vom 19. Juni 2024, 18:16 Uhr von BLinz (Diskussion | Beiträge) (→‎Variante 2: Verlinken)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)

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:

ClipCapIt-240615-124651.PNG

SSH Key erzeugen

Wir melden uns per SSH an der pfSense an (Benutzer admin):

ClipCapIt-240615-124947.PNG

und wählen Option 8.
Dann geben wir den Befehl

ssh-keygen ein, die Passphrase lassen wir leer:
ClipCapIt-240615-125211.PNG

Nun können wir uns den Public Key anzeigen lassen:

cat /root/.ssh/id_rsa.pub
ClipCapIt-240615-125436.PNG

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:

ClipCapIt-240615-125852.PNG

Wenn Ihr euch einmal mit exit wieder trennt und noch mal neu verbindet sollte es ohne Nachfrage geschehen.


Kopieren testen

Important.png
Hinweis: Diese Variante kopiert jedes mal alle vorhandenen Zertifikate!

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/
ClipCapIt-240615-130250.PNG

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:

ClipCapIt-240615-131028.PNG


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:

ClipCapIt-240616-153143.PNG

Wer will kann auch gleich auf dem Reiter Redirect den Haken bei der Umleitung auf SSL setzen:

ClipCapIt-240616-153352.PNG

Auf dem Reiter SSL ganz unten stellt Ihr die SSL Action: auf Create certificate:

ClipCapIt-240616-153804.PNG

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:

ClipCapIt-240616-153940.PNG

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 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
ClipCapIt-240615-133851.PNG

Im Dialog danach wählt Ihr

Feature hinzufügen

und wählt aus der Liste den OpenSSH-Server:

ClipCapIt-240615-134028.PNG

Sobald dieser Installiert ist, ruft die die Dienste auf, sucht den Dienst und stellt diesen um auf "Automatischer Start" und startet diesen auch gleich:

ClipCapIt-240615-134351.PNG

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...