Ich bin gerade ein wenig am verzweifeln! :-D
Ich habe hier eine opnsense mit ntopng auf einem FreeBSD (als VM auf
Proxmox) am laufen. Nun möchte ich die Rest API von ntopng nutzen. Das
funktioniert auch soweit, allerdings sind einige Daten ausschließlich
SSL Verschlüsselt (HTTPS) abrufbar.
Das alles ist ja soweit ganz gut. Auf dem Webserver (Debian 13 als
Container auf Proxmox), auf dem ich die Daten abrufen mag funktioniert
soweit auch alles, bis auf SSL.
Per bash funktioniert die Abfrage auf dem Webserver mit -k zum
ignorieren der Authentifkation auch tadellos und er gibt das zu
erwartende JSON aus.
Auf der gleichen Maschine mit Apache2 als Webserver und php8.4 wirft mir
curl mit der Verwendung der Optionen CURLOPT_SSL_VERIFYPEER und
CURLOPT_SSL_VERIFYHOST auf false (Was ja das Equivalent zu -k ist) ein
Fehler aus:
Okay, dachte ich mir, probiere ich halt ein SSL Zertifikat aus und mache
es "ordentlich". Aber da scheitere ich am Zertifikat. Wenn ich das
Zerifikat des Servers übernehmen mag, dann schreit mich Curl an das es
ein selbst Zertifiziertes ist und er dies nicht aktzeptiert.
Die Abfrage von curl -v auf dem opnsense Server sieht wie folg aus:
* SSL certificate problem: self-signed certificate in certificate chain
16
* closing connection #0
17
curl: (60) SSL certificate problem: self-signed certificate in certificate chain
18
More details here: https://curl.se/docs/sslcerts.html
19
20
curl failed to verify the legitimacy of the server and therefore could not
21
establish a secure connection to it. To learn more about this situation and
22
how to fix it, please visit the webpage mentioned above.
Auf dem opnsense Server habe ich ein Root-CA, ein Intermediate-CA und
das Leaf-CA erstellt.
Wie bekomme ich Curl dazu diese Zertifikaten (oder das Root-CA) als
Glaubwürdig zu erkennen?
Oder wie bekomme ich curl in php dazu die SSL Zertfizierung (wie curl
über die bash) einfach zu ignorieren? Das System läuft sowieso nur
intern und ist von außerhalb nicht zu erreichen.
Ich bin auf euer Schwarmwissen angwiesen :-D
SSL mit self signed Zertifikaten ist so ne Sache und erfordert viele
Klimmzüge...
Tu dir einen Gefallen, besorg dir ein echtes Zertifikat.
Entweder kostenlos von letsencrypt. Da musst vielleicht ein bisschen
basteln, dass die automatische Aktualisierung klappt, wenn das System
von außen nicht erreichbar ist. Oder du kaufst dir eins, ggf sogar ein
Wildcard. (und nach 2 Jahren den Wechsel nicht vergessen)
Du brauchst auf jeden Fall auch eine Domain wo du DNS Einträge anlegen
kannst. Die kannst dann auch auf 10.x.x.x zeigen lassen.
Gruß Roland
Roland P. schrieb:> SSL mit self signed Zertifikaten ist so ne Sache und erfordert viele> Klimmzüge...
So ein Quark...
> Entweder kostenlos von letsencrypt. Da musst vielleicht ein bisschen> basteln, dass die automatische Aktualisierung klappt, wenn das System
Ahso, Klimmzüge mit selfsigned, aber Basteln mit letsencrypt.
Prima Idee...
@Rene K.:
Kopier Deine selbst erstellten Zertifikate, z.B. das der Root CA von
OpnSense auf Deinem Linux-System nach:
/usr/local/share/ca-certificates/
und ruf dann
1
update-ca-certificates
auf. Dann sollte es funktionieren.
Ebenso kannst Du natürlich Deine eigenen Zertifikate in Deine Browser
importieren. Der akzeptiert die dann auch.
Ist echt nicht schwer und erfordert weder Klimmzüge noch Gebastel noch
Geldausgeben.
Alexander schrieb:> Warum hast Du CURL_SSLVERSION_TLSv1_2 auskommentiert...
Und warum CURLOPT_SSL_CIPHER_LIST? Wenn der Handshake fehlschlägt, ist
genau die obige Fehlermeldung die Folge.
Roland P. schrieb:> SSL mit self signed Zertifikaten ist so ne Sache und erfordert viele> Klimmzüge...
So ein Quark.
> Tu dir einen Gefallen, besorg dir ein echtes Zertifikat.
Das funktioniert auch innerhalb eines lokalen Netzes für einen rein
lokalen Hostnamen ganz toll...
> (und nach 2 Jahren den Wechsel nicht vergessen)
Mit dem Wissen aus dem letzten Jahrzehnt kommst Du heute nicht weiter
und 2027 oder spätestens 2029 fällt Dir Dein ganzes Konzept kolossal auf
die Füße.
@TO:
Entweder wie Richie geschrieben hatte das Cert Deines Servers im
Betriebssystem installieren und dann update-ca-certificates.
Die andere Variante ist dass Du dieses eine Cert explizit im curl aus
einer Datei lädst. Dafür packst Du das in etwa so in Dein setopt-array:
1
CURLOPT_CAINFO=>"/pfad/servercert.pem",
Wenn Du es auf der Kommandozeile probierst, dann aktivierst Du diese
Funktion mit dem "--cacert [file]"-Parameter.
Wenn curl auf der Kommandozeile funktioniert, aber in einem Programm
eingebunden nicht, werden irgendwelche Optionen falsch gesetzt sein.
Praktischerweise bietet curl auf der Kommandozeile die Möglichkeit,
passend zu genau dem jeweiligen Kommandozeilenaufruf C-Quelltext zu
erzeugen, in dem die jeweiligen Optionen passend gesetzt sind.
Das sieht im wesentlichen so aus:
1
curl http://example.com --libcurl example.c
Für den Aufruf oben gibt es diesen Code hier:
1
/********* Sample code generated by the curl command line tool **********
2
* All curl_easy_setopt() options are documented at:
Rene K. schrieb:> routines::unexpected eof while reading
Scheint mir anzudeuten, dass der Server die Verbindung abgebrochen.
Schau in dessen Log, um den Grund dafür zu finden.
Richie schrieb:> Kopier Deine selbst erstellten Zertifikate, z.B. das der Root CA von> OpnSense auf Deinem Linux-System nach:> /usr/local/share/ca-certificates/> und ruf dann>
1
>update-ca-certificates
2
>
> auf. Dann sollte es funktionieren.> Ebenso kannst Du natürlich Deine eigenen Zertifikate in Deine Browser> importieren. Der akzeptiert die dann auch.> Ist echt nicht schwer und erfordert weder Klimmzüge noch Gebastel noch> Geldausgeben.
Das ist die einzige absolut richtige Antwort in diesem Thread, danke.
Ein T. schrieb:> Das ist die einzige absolut richtige Antwort in diesem Thread, danke.
Sehe ich nicht so. Der TO möchte sein selbst erstelltes Zertifikat
ungeprüft verwenden. Das ist bei SSL generell ein vorgesehenes
Szenario und ich weiß mit Sicherheit, daß libcurl das auch kann.
Unabhängig davon möchte ich noch was zu gekauften Zertifikaten los
werden:
Selbst erstellte Zertifikate müssen nicht zwingend unsicher sein, wenn
man das Zertifikat auf anderem Weg prüft (z.B wie von Richie
aufgezeigt). Manche machen es alternativ durch Kontrolle eines Hashes.
In beiden Fällen ist man nicht gezwungen, Firmen zu vertrauen, die vom
Verkauf der Zertifikate leben und denen man im Fall des Missbrauchs
bestenfalls den Allerwertesten lecken darf.
Mario M. schrieb:> Alexander schrieb:>> Warum hast Du CURL_SSLVERSION_TLSv1_2 auskommentiert...>> Und warum CURLOPT_SSL_CIPHER_LIST? Wenn der Handshake fehlschlägt, ist> genau die obige Fehlermeldung die Folge.
Auch mit diesen zwei Optionen gibt es:
Ein T. schrieb:> Richie schrieb:>> Kopier Deine selbst erstellten Zertifikate, z.B. das der Root CA von>> OpnSense auf Deinem Linux-System nach:>> /usr/local/share/ca-certificates/>> und ruf dann>>> update-ca-certificates>>>> auf. Dann sollte es funktionieren.>> Ebenso kannst Du natürlich Deine eigenen Zertifikate in Deine Browser>> importieren. Der akzeptiert die dann auch.>> Ist echt nicht schwer und erfordert weder Klimmzüge noch Gebastel noch>> Geldausgeben.>> Das ist die einzige absolut richtige Antwort in diesem Thread, danke.
Habe ich, also ich habe sowohl das root-CA, den Intermediate-CA und das
Zertifikat als PEM Datei auf den Webserver (der mit Curl auf ntopng
zugreifenn soll) in /usr/local/share/ca-certificates/ gezogen (0644 als
Rechte) danach auf dem Webserver ein update-ca-certificates ausgeführt:
1
draco@WebServer:~# update-ca-certificates
2
Updating certificates in /etc/ssl/certs...
3
0 added, 0 removed; done.
4
Running hooks in /etc/ca-certificates/update.d...
5
done.
Er hat quasi, keine neuen Zertifikate hinzugefügt. Auch ein Kopieren der
Zertifikate in /etc/ssl/certs/ hat selbige Ausgabe.
Nemopuk schrieb:> Rene K. schrieb:>> routines::unexpected eof while reading>> Scheint mir anzudeuten, dass der Server die Verbindung abgebrochen.> Schau in dessen Log, um den Grund dafür zu finden.
Mag sein, da dies aber eine Webanwendung ist (ntopng) habe ich keine
Ahnung ob / wie und wo dort überhaupt Logs geschrieben werden.
Ich habe mir jetzt nochmal die Bash Ausgabe mit ... angeschaut:
Der Datensatz geht dann weiter und es kommt dann irgendwann nochmalig
genau das selbe. Bei mehreren Durchgängen ist der error:0A0000126 immer
an Unterschiedlichen, nicht reproduzierbaren Stellen.
Ich wollte sehen ob Du Security level auf 0 gesetzt hast wie
vorgeschlagen. Aber wurde schon mit OpenSSL 3.0.0+ auf SECLEVEL=2
gehoben, also vor 3.0.17. Du könntest auch TLS 1.1/1.0 erzwingen.
Bei "unexpected eof" müsste man auf jedenfall eigentlich in den Logs des
aufgerufenen Webservers schauen. Der hat die Verbindung vermutlich
einfach geschlossen, sobald er gemerkt hat das man mit dem Client nicht
auf einen gemeinsamen Nenner kommt.
ggf. kann man auch mit CURLOPT_VERBOSE+CURLOPT_STDERR noch an
irgendetwas hilfreiches ran kommen.
Bei debian/ubuntu könnte man ggf. versuchen ob es ggf. mit den
PHP-Paketen von sury statt den Debian-eigenen klappt:
https://deb.sury.org/https://wiki.debian.org/AdditionalPHPVersions
Damit funktioniert die Abfrage tadellos. Nach Recherchen ist dies
tatsächlich ein Fehler seit OpenSSL 3. Diesen kann man zwar beheben in
den man Curl, OpenSSL modifiziert und kompiliert - das kann ich aber
nicht :-D
Für meine Zwecke reicht diese Kombination erstmal vollkommen aus.
Alexander schrieb:> Das ist kein Bug das ist ein Feature.
Das ist kein Feature sondern ein Bug in Verbindung mit cURL / php-curl
und ist bekannt:
https://github.com/openssl/openssl/discussions/22690Alexander schrieb:> Was willst Du da modifizieren?
OpenSSL via SSL_OP_IGNORE_UNEXPECTED_EOF mitteilen das er ein eof
ignorieren soll, was aber nicht bei php-curl funktioniert, da dies ihre
eigene Version mitbringt. Dann bleibt einem nur übrig php-curl / OpenSSL
mit eben dieser Funktion neu zu kompilieren.