Linux Server Zertifikat erneuern via Commandline - how to?
Hallo zusammen
Habe folgendes Problem. Linux Web App und Web Service auf Azure gehostet.
Seit kurzem wirft mir der Web Service folgenden Fehler:
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
So, nun ist das im Grund einfach erklärt. Der Server A verbindet via SSL / 443 auf Server B. und siehe da - das Zertifikat ist nicht auffindbar. Firewall gecheckt, alles Connections sind sauber eingerichtet. Ich habe herausgefunden, dass das auch ein Java Framework issue ist bzw. das Framework, auf dem die Software auf Server A aufgebaut ist diesen Issue begünstigt.
nun zur eigentlichen Frage: Wie zur Hölle kann ich auf der Linuxkonsole das Zertifikat Server B zeihen und sauber ablegen. Ich kann das NUR via SSL machen also 0 GUI!
meine Versuche:
openssl s_client -CApath /etc/ssl/certs -connection host:443 < /dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > hostname.crt
ich kriege das einfach nicht gebacken. Könnt ihr mal völlig unvoreingenommen vom gerade geposteten versuche mir einen Lösungsweg aufzugeigen den ihr gehen würdet?
danke im Voraus
1 Antwort
Hey ho,
so wie ich dich verstehe möchtest du das Zertifikat von Server B herunterladen und dann im CertStore / Truststore ablegen, oder?
Ist das Zertifikat von einer CA unterschrieben? Dann könntest du auch der CA vertrauen und dem Zertifikat würde vertraut werden. Entweder lädst du es per Browser runter und wirfst es mit scp oder einem Editor deiner Wahl hoch (ist ja nur Text). Oder eleganter mittels openssl wie du es bereits probiert hast, pack aber noch eine Umleitung von stdErr nach dev/null dazu, dann verschwinden die Zusatzinfos:
openssl s_client -CApath /etc/ssl/certs -connection host:443 < /dev/null 2>/dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > hostname.crt
Ich würde schauen, dass ich die CA Zertifikate in den Truststore werfe, allerdings kommt es darauf an welche Distribution und welche SSL Lib du verwendest. Wenn du einen JavaClient nutzt, musst du diesen vermutlich bei Java hinterlegen, ich erinnere mich dass Java seine Zertifikat selbst verwaltet und nicht von Openssl verwendet.
Eventuell kannst du aber auch bei deinem Javaclient den CApfad angeben, entweder im Framework oder bei der Java Ausführung.
Welches Java, Framework nutzt du denn? Dann kann man ggf. mal nachlesen.
Aber kurz zur Erklärung, der Openssl connect Befehl funktioniert, liefert dir auch das Zertifikat aus und der CA Chain ist trusty? Bei Lets Encrypt zum Beispiel würde es so aussehen:
depth=2 C = US, O = Internet Security Research Group, CN = ISRG Root X1
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = R3
verify return:1
depth=0 CN = xyz.tld
verify return:1
DONE
Hey ho,
ja das typische Problem bei Linux, zu wissen wo die Zertifikate hin müssen. Ubuntu und Debian haben unter /etc/ssl/certs/ eine Ansammlung von Zertifikaten. Wenn du die dort hinterlegst, musst du meine ich mit update-ca-certs noch einmal in den globalen Store kopieren lassen.
https://ubuntu.com/server/docs/security-trust-store
Da steht beschrieben wie es funktioniert. Bei Java sieht es aber glaube ich noch anders aus, da würde ich mal probieren ohne keystore die Datei hinzuzufügen, denn vllt nimmt das Tool den Standardpfad. Du musst auf jeden Fall bei keystore eine Datei angeben, wenn du -keystore verwendest, keinen Ordner (siehe Fehlermeldung).
Aber deswegen fragte ich nach dem Framework oder der Java Version. Vielleicht wirst du darüber schlau, führe java -version oder --version aus und les dich mal ein, wie du bei der jeweiligen Java Version CA Certs hinzufügst. Könnte sein, dass OpenJDK, Oracle JDK und Konsorten es anders handhaben, da bin ich nicht ganz im Thema.
Hoffe ich konnte trotzdem bisschen helfen :)
du hast mir sehr geholfen. der KeyStore ist unter /opt/java/openjdk/lib/security/cacerts
ich habe es dann so hinbekommen:
- ins Verzeichnis /usr/local/tomcat/webapp gewechelt
- openssl s_client -connect HOST:443 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > HOST.crt ausführen
- which java ausführen
- in Folder /opt/java/openjdk/lib/security/ wechseln für check
- zurück zu /usr/local/tomcat/webapp
- keytool -import -alias "ALIASNAME bei mir gleich HOSTNAME" -keystore /opt/java/openjdk/lib/security/cacerts -file HOST.crt ausführen
- Passwort changeit (ist Standard so in Linux) eingeben
=> keine Fehlermeldung bei der Ausführung
Lustig ist;
offenbar ist die Firewall doch Teils zu (aus welchem Grund auch immer) und deswegen geht das Ganze nicht. Versuche diesen Lösungsansatz aktuell noch mit dem Firewallteam. Lustig ist auch; selbst wenn die Firewall nicht das Problem wäre, nach dem Reboot des WebApp wären alle oben erwähnten Einstellungen 1-6 wieder überschrieben. Azure ist so konfiguriert. Offenbar gibt es da in Azure Virtual Server oder Azure DevOps ein Share. Da muss alles konfiguriert werden weil nach jedem Reboot die Einstellungen die auf dem Share (Host / Client) angezogen werden. Und jetzt habe ich das Problem, dass ich den Share nicht finde. Ich liebe es, nach Ressourcenabgängen deren Arbeit zu übernehmen... ;-)
danke dir auf alle Fälle und hoffe, oben beschriebenes hilft dem einen oder anderen. viele Grüsse...
Hallo und vielen lieben Dank - Problem ist, ich habe auf dem System sehr primitive Möglichkeiten. Wurde von meinem Vorgänger eingerichtet und die Dokumentation, du ahnst es, ist 0,0 zu gebrauchen. Was das heisst, ich muss alle von dir oben, zurecht erfragten Dinge selber auch ausfindig machen. Zum Framework. Der Hersteller der SW hat mir bestätigt, dass die das Problem schon bei einem Kunden hatten. Seine Anleitung zur Problemlösung kann ich nicht verwenden, weil er davon ausgeht, dass ich einen Windows Host verwende und da Zertifikate in den bekannten C: Strukturen von Win. herumschiebe. Geht nicht. Ins Framework tauche ich somit erst tiefer ein, wenn ich das mit dem Zert. Import heute nicht hinbekomme.
Danke für den Tipp. also ich führe zuerst den Befehlt oben von dir aus und dann mache ich noch sowas hier, was meinst du?
keytool -import -alias HOST -keystore PFAD ZUM KEYSTORE -file HOST.crt
was ich gestern noch bis spät nicht hinbekommen habe, ist ausfindig zu machen wie der Pfad zum Keystore lautet. Ich hab /etc/ssl/certs angenommen. aber irgendwie kriege ich dann den Error:
keystore error: java.io.FileNotFoundExeption: /etc/ssl/certs (is a directory)
Vielleicht verstehe ich die Befehle auch nicht wirklich, wollen wir die nochmals durchgehen, damit ich einen Sparringpartner habe. musste mir das alles zusammensuchen und bin schon seit Jahren nicht mehr als Sysadmin im Einsatz.
Danke dir vielmals. komm gut in den Freitag...