Hallo.
Ich habe unsere OPNSense-Firewall so eingerichtet, dass sie über das LE-Plugin Let's Encrypt Zertifikate holt und erneuert. Nun brauchte ich dieses Zertifikat nicht nur auf der FW sondern auch lokal auf einem Server. Daher habe ich alle Dateien unter
Quote"/var/etc/acme-client/home/"
heruntergeladen und lokal verwendet.
Wenn ich nun
echo -n | openssl s_client -connect server:443
verwende, erhalte ich
CONNECTED(00000005)
depth=0 CN = server.meine-domain.de
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 CN = server.meine-domain.de
verify error:num=21:unable to verify the first certificate
verify return:1
---
Certificate chain
0 s:CN = server.meine-domain.de
i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
---
Und ganz unten dann nochmals:
Verify return code: 21 (unable to verify the first certificate)
Wenn ich das gleiche auf der Firewall selbst ausführe, ist die Zertifikatskette vollständig. Dort erhalte ich dann die richtige Ausgabe:
---
Certificate chain
0 s:CN = firewall.meine-domain.de
i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
1 s:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
Die Frage ist: Warum? Was fehlt da bzw was ist falsch konfiguriert?
Am HAProxy liegt es offenbar nicht, denn wenn der Service ausgeschaltet ist, erscheinen die gleichen Meldungen.
Danke für eine gute Idee!
Hast Du die root certificate auf dem Server installiert?
Und wenn es ein Intermediate dazwischen hast kommt das meist vorher
Server:
Server
Local trust:
intermediate
root
Am besten mal das cer anschauen in text editor.
A
Das root-cert ist doch per default installiert, oder??
DST Root CA X3 ist vorhanden.
DST_Root_CA_X3.pem -> /usr/share/ca-certificates/mozilla/DST_Root_CA_X3.crt
Quote
Am besten mal das cer anschauen in text editor.
Wie meinst du das -- bzw was dann?
Ich kenne lets encrypt nicht.
Wir hatte nur immer Probleme wenn Intermediates dazwischen waren.
Da hat das intermediate oft gesponnen wegen der Reihenfolge.
Aber hier sieht doch alles danach aus, als sei das Gegenteil der Fall: die Kette ist zu kurz. Normalerweise sollte sie so aussehen wie im Fall der firewall oben -- also über 3 Zertifikate gehen
> "/var/etc/acme-client/home/"
> heruntergeladen und lokal verwendet.
Und welche Dateien hast du da erhalten? Ich vermute das Stammzertifikat (CA) von ACME/LetsEncrypt ist da nicht mit drin oder das Intermediate fehlt?
Diese Dateien sind in dem Ordner enthalten:
-rwxr-x--- 1 root wheel 1648 Jan 29 10:08 ca.cer*
-rwxr-x--- 1 root wheel 3933 Jan 29 10:08 fullchain.cer*
-rwxr-x--- 1 root wheel 2285 Jan 29 10:08 server.meine-domain.de.cer*
-rwxr-x--- 1 root wheel 958 Jan 29 10:08 server.meine-domain.de.conf*
-rwxr-x--- 1 root wheel 1700 Jan 29 10:08 server.meine-domain.de.csr*
-rwxr-x--- 1 root wheel 220 Jan 29 10:08 server.meine-domain.de.conf*
-rwxr-x--- 1 root wheel 3243 Nov 21 11:32 server.meine-domain.de.key*
Davon habe ich alles außer *.conf auf den Server gepackt.
Das root-Cert ist doch *immer* vorhanden. Es fehlt wahrscheinlich eher das intermediate von LE? Aber ich dachte, dass das mit in der fullchain steckt?
Full chain sollte am Webserver verwendet werden, da ist das Zertifikat und alle intermediate Zertifikate drin. Verwende ich selbst mit nginx ohne Probleme.
Also wenn ich folgendes auf einem Client mache, klappt es:
Unter /usr/local/share/ca-certificates einen Link auf das heruntergeladene cacert.crt und anschließend
update-ca-certificates
(Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...
done.)
Danach:
openssl s_client -connect server:443
und siehe da:
Verify return code: 0 (ok)
... aber ist das die richtige Vorgehensweise? Ich dachte, dass das intermediate-cert auch vom Server heruntergeladen wird und dann die Kette als gültig angesehen wird??
Nur wenn das intermediate von einer CA in deinem Store signiert ist.
moment -- verstehe ich jetzt nicht, aber vielleicht reden wir auch aneinander vorbei:
Der Aufbau der Zertifikatskette ist hier dieser:
1.) Root-cert DST Root CA X3
2.) Let's Encrypt Authority X3
3.) Eigenes Cert (von LE erstellt)
Nummer 2 ist für meine Begriffe das intermediate-cert, das sich hinter cacert.pem verbirgt.
Das root-Cert ist ebenfalls vorhanden -- und zwar per default unter /etc/ssl/certs/
Sollte es nicht so sein, dass AUCH das cacert (also Nr2) vom Server heruntergeladen wird, wenn mit openssl die Verbindung auf Port 443 aufgemacht wird?
Ja, dein Server sollte die ganze Chain ausliefern.
Ja -- soweit die Theorie. Was könnte der Grund sein, dass er das nicht macht?
Ich habe den Verdacht, dass ich die auf der OPNSense-FW durch das LE-Plugin erzeugten Dateien unter
/var/etc/acme-client/home/server.meine-domain.de
nicht problemlos weiter verwenden kann? So ist z.B. in der Datei "fullchain.cer" eine Leerzeile, die da IMHO nicht stehen darf?
Wenn ich diese Dateien auf den Host, für den sie erstellt wurden, kopiere und dort anschließend einen check mit openssl mache, erhalte ich jedenfalls die o.g. Fehlermeldungen. Die Chain ist unterbrochen/nicht vollständig.
Kann das jemand bestätigen?
Wie gesagt, ich lade diese Datei auf fabian-franz.eu - daher weiß ich dass die geht.
Bei dir ist die Chain aber auch in Orndung:
---
Certificate chain
0 s:CN = fabian-franz.eu
i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
1 s:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
i:O = Digital Signature Trust Co., CN = DST Root CA X3
---
Ich verstehe einfach nicht, warum das hier nicht klappt!
ist so konfiguriert (ich verwende lieber die PEM Dateiendung - ist aber das selbe Dateiformat):
ssl_certificate_key /path/to/key.pem;
ssl_certificate /path/to/fullchain.pem;
die fullchain sieht so aus:
-----BEGIN CERTIFICATE-----
MIIFaj...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIEkjC...
-----END CERTIFICATE-----
Ich würde da wirklich an deiner Stelle mal die Server config prüfen. Vielleicht musst du CA chain und Serverzertifikat getrennt angeben.