Frage zum Keystore

Joob

Top Contributor
Kann man in einer App beim Start

1. eine Schlüssel aus dem Keystore löschen, über den ALIAS
2. einen neuen Schlüssel in den Keystore einfügen, welcher vom Server geladen wurde

und dann die App weiterlaufen lassen und diese verwendet dann den neuen Schlüssel ?
 
K

kneitzel

Gast
Natürlich kannst Du den Keystore verändern. Eine kleine Übersicht bietet z.B. Baeldung unter:

Und wenn die Applikation dann erst Schlüssel lädt, dann lädt sie natürlich den neuen Key.
 

Joob

Top Contributor
Erst mal danke, aber wieder einmal bin ich unsicher ob man das überhaupt so macht.

Ich versuche seit ein paar Tagen herauszufinden wie ich aus den privatekey.pem auf meinem Server eine cer-Datei mit dem öffentlichen Schlüssel erzeugen kann und bekomme immer mehr das Gefühl das ich das alles falsch angehe. Insbesondere da ich ja die Letsencrypt Certifikatskette komplet in der cert-Datei haben muss.

Meine grundsätzliche Überlegung war die:

Der CertBot renewed den Key,
das macht er im CronJob.
Ein Renew wird durchgeführt kurz bevor der Schlüssel abgelaufen ist.
Also und hier stehe ich an der ersten Hürde, würde ich gerne immer wieder den öffentlichen Schlüssel auf meinem Server
zum Download ablegen.
Dazu muss ich eine cer-Datei erzeugen, das bekomme ich aber nicht hin und bin total unsicher ob dann auch die komplette Kette im Key ist oder ob das gar nicht gebraucht wird.


Da meine App von dem Kram nichts weiß, soll sie als erstes mal den öffentlichen Schlüssel herunterladen.
Nun käme deine Hilfe mit der ich , dann über den Alias die den alten Key im Keystore löschen und nun die heruntergeladene Datei in dem Keystore der App unter gleichem Alias speichern.
Damit wäre dann alles Startklar.
Dateidownload geschieht über SFTP und für das folgende https ist alles vorbereitet. Das mach ich bei jedem Start der App und habe somit immer den aktuellen Key am Start. Es entsteht kein Sicherheitsproblem da nur der öffentliche Key downgeloaded wird und den kann ich ja auch aus dem Browser herauslesen.

Geht das so, oder ist das Quatsch und man macht das ganz anders.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Sorry, aber ich blicke noch nicht wirklich durch, was Du überhaupt versuchst.

Generell erzeugt Dir das certbot Tool alles, was Du brauchst. Falls Du es in einem anderen Format brauchst, dann kann man da einiges umwandeln.

Was ich laufen lasse nach einem renew:
a) ein pem File, das wirklich alles enthält:
Java:
rm fullcert.pem
cat cert.pem chain.pem fullchain.pem privkey.pem > fullcert.pem

b) pkcs12 File (Mittels openssl):
Java:
rm fullchain.pkcs12
openssl pkcs12 -export -out fullchain.pkcs12 -in fullcert.pem -passout pass:mySecret

c) jks für Java Programme z.B. Tomcat:
Java:
rm keystore.jks
keytool -importkeystore -srckeystore fullchain.pkcs12 -srcstorepass mySecret -destkeystore keystore.jks -deststoretype JKS -deststorepass mySecret

mySecret muss das Passwort sein, mit dem Du es schützen willst ...

Aber da musst Du nichts groß herunter laden. Später beim SSL Handshake wird automatisch alles zum Client übertrage. Der Server braucht halt nur die Zertifikate.... Wo soll das Zertifikat denn wie eingesetzt werden? Also bei meinen Servern tausche ich nur das Zertifikat-File aus und starte den Service neu. Also jks austauschen und neustart des Tomcat.
 

Joob

Top Contributor
Ich habe auf dem Server kein Java laufen.

Das findet alles in der APP beim Benutzer statt.

In der App welche beim Benutzer installiert ist, muss ich doch das Zertifikat (Keystore) austauschen wenn dieses abgelaufen ist.
Auf dem Server erstellt also der Zertbot ein neues Zertifikat.
Dieses neue Zertifikat muss doch dann bei den Benutzern ankommen und im Keystore gespeichert werden.

Auf dem Server hatte ich mir openssl angeschaut, denn damit wollte ich einen PublicKey erstellen und zum download bereitstellen.
Genauso wie ich die cer Datei aus dem Browser erstellen kann und dann auf dem Lokalen Rechner in den Keystore einlese, wollte ich die cer Datei vom Server herunterladen und dann im Keystore des Users aktualisieren.
 
K

kneitzel

Gast
Was brauchst Du denn auf der Client Seite wofür? Den Public Key musst Du nicht erstellen, denn den hast Du doch schon erstellt bekommen. Ebenso wie alle anderen notwendigen Zertifikate wie das intermediate.

Generell kannst Du aber den Ansatz, den ich oben gezeigt habe, fast 1:1 übernehmen. Den private key kann man ja weg lassen. Und der Java Keystore kann ja dann den Clients gegeben werden.

Aber ich verstehe dennoch nicht, was die Clients mit dem Zertifikat machen sollen. Denn die sollen ja jetzt nur den public key (mit dem intermediate und ggf. dem root Zertifikat so dem noch nicht vertraut wurde) kriegen?

Dann muss ja der private Key auch irgendwo Verwendung finden, oder? Also für eine https Verbindung oder so.
Wenn das dein Szenario wäre, dann brauchen die Clients da nur den Trust auf das root Zertifikat von letsencrypt. Denn der Server sollte dann public key und intermediate Key automatisch im Handshake zur Verfügung stellen.

Oder nutzt Du das irgendwie anders? Also kein Handshake sondern Du nutzt den private Key um etwas zu verschlüsseln / signieren oder so und das soll der Client dann entschlüsseln können?

Vielleicht kannst Du den genauen Usecase ja einmal vorstellen.
 
K

kneitzel

Gast
Ach so - nur um dann evtl. auf offene Fragen einzugehen (Ich gehe den Thread gerade noch einmal von oben durch um mal zu sehen, ob ich es besser verstehen kann) und dabei werfe ich Dir jetzt einfach paar Bruchstücke zu, die Dir ggf. weiterhelfen auch ohne dass ich verstanden habe, was Du da im Detail baust:

Dazu muss ich eine cer-Datei erzeugen, das bekomme ich aber nicht hin
Certbot erstellt ja pem Dateien. Die kann man umwandeln in eine CER Datei mittels openssl. So eine Umwandlung wäre z.B.:
Code:
openssl x509 -inform PEM -in cert.pem -outform DER -out certificate.cer

über den Alias die den alten Key im Keystore löschen
Das ginge zum einen über das keytool:
Code:
keytool -delete -noprompt -alias ${cert.alias}  -keystore ${keystore.file} -storepass ${keystore.pass}
Oder auch in Java mit der KeyStore Klasse. Die verlinkte API Dokumentation zeigt da vieles direkt auf. Keystore öffnen (getInstance mit Datei und Passwort) und dann löschen per deleteEntry.
die heruntergeladene Datei in dem Keystore der App unter gleichem Alias speichern
Das ginge dann per keytool:
Code:
keytool -import -alias ${alias} -file ${file.cer} -keystore ${keystore.jks}

Oder eben auch per Java Code. Da würde ich aber generell ein JKS Format nutzen. Also Keystore öffnen (Siehe Klasse oben), Zertifikat laden und dann per setCertificateEntry (für einzelnes Zertifikat) oder setKeyEntry (für z.B. ganze Chains) einfügen.

Das wären dann noch ein paar weitere Schritte, die Dir evtl. irgendwie weiter helfen könnten...
 

Joob

Top Contributor
Das ist total nett von Dir das du dich so um mein Problem kümmerst.

Vielleicht sehe ich das zu kompliziert.
Ich schreib mal wie ich das bisher verstanden habe.

Der CertBot erneuert das Zertifikat kurz bevor dieses abgelaufen ist und speichert das Zertifikat auf dem Server.
Die App muss nun den neuen PublicKey kennen um sich beim Handshake auf dem Server zu identifizieren.
Dazu muss der neue PublicKey in KeyStore der App vorhanden sein.
Der PrivateKey darf unter keinen Umständen vom Server denn er ist geheim.

Auf dem Server würde ich dann mit
Java:
openssl x509 -inform PEM -in cert.pem -outform DER -out certificate.cer
den neuen PublicKey auf dem Server im Verzeichnis var/www/html.... zur Verfügung stellen.
Das würde ich im Rahmen des CronJobs vom CertBot immer machen.

Damit liegt auf meinem Server immer der korrekte publicKey in der cer-Datei, auch nach dem Durchgeführten Renew.
Kein Sicherheitsrisiko denn diese kann ich mir auch im Browser generieren.

Auf Seiten der App:
bevor die App https verwendet, muss der aktuell auf dem Server liegende Key im KeyStore der Anwendung gespeichert werden.
(Eigentlich nur nach einem Renew, aber das ist ja unnötig komplex)
Dazu lädt die App den auf dem Server liegenden PublicKey bei jedem Start
und entfernt im eigenen Keystore den alten PublicKey per ALIAS und lädt den gerade geladenen PublicKey in den Keystore.
Java:
keytool -delete -noprompt -alias ${cert.alias}  -keystore ${keystore.file} -storepass ${keystore.pass}
keytool -import -alias ${alias} -file ${file.cer} -keystore ${keystore.jks}

- Mache ich das zu kompliziert oder habe ich das alles falsch verstanden ?
- Wenn ich aus der pem Datei privatekey.pem die cer-Datei erstelle ist das dann ein für den Handshake brauchbares Zertifikat oder muss ich da noch etwas hinsichtlich der Zertifikatskette bedenken ?
 
Zuletzt bearbeitet:

Joob

Top Contributor
Eventuell gibt es hinsichtlich der Konstruktion noch etwas wichtiges zu sagen.
Der Benutzer installiert sich die App auf seinem PC per Installationsprogramm.
Auf dem Server werden nur Daten abgelegt, einerseits als Dateien andererseits in einer DB auf welche per PHP zugegriffen wird.
 
K

kneitzel

Gast
Die App muss nun den neuen PublicKey kennen um sich beim Handshake auf dem Server zu identifizieren.
Das ist schon der Punkt, wo ich nicht mitkomme. Das Zertifikat ist ein Zertifikat von Letsencrypt, wenn ich Dich richtig verstanden habe. Das ist erst einmal kein Client Zertifikat, mit dem ein Client sich autorisiert. (Technisch zwar denkbar, aber wenn Du da bei der Verifizierung was falsch machst, akzeptierst Du plötzlich alle Zertifikate, die von Letsencrypt ausgestellt wurden und so ...)

Vorgehen wäre daher, das Du eine eigene CA führst, die dann Zertifikate ausgibt und diese dann auch widerrufen kann und so. Und denen kannst Du dann mit gutem Gewissen vertrauen.

Wenn es nicht um ein Client Zertifikat geht. mit der der Client sich authentifizieren soll sondern nur um https, dann musst Du gar nichts machen!

Du hast also PHP genannt. Das läuft dann unter einem Apache Webserver oder so. Dem kannst Du die Zertifikate direkt so geben. Clients brauchen gar nichts. Dann kann Deine Applikation aber auch ein Webbrowser auf deinen Server zugreifen. Im Rahmen des Handshakes bekommen die Clients dann das Zertifikat. Dieses prüfen sie dann auf diverse Kriterien:
a) Ist es für die aufgerufene Adresse gültig? (Also z.B. www.joob.de oder was auch immer Du hast)
b) Wird dem Aussteller vertraut (Dazu wird ggf. ein Intermediate Zertifikat mit geprüft)
c) Ist es schon/noch gültig.

Daher: Keinerlei manueller Aufwand. So ist es ja auch gedacht.
 

Joob

Top Contributor
Das heißt also wenn ich einmal das Certifikat von letsencrpyt im Keystore gespeichert habe, ist es nicht
von Bedeutung das der CertBot das Zertifikat erneuert hat, sondern alles läuft einfach weiter ohne das ich etwas tun muss.

Im Rahmen des Handshakes werden die Keys getauscht und dann die Kommunikation verschlüsselt zwischen Server und Client gesendet.

Das wäre ja super.
 
K

kneitzel

Gast
So Du nur SSL Verschlüsselte Verbindungen von Clients zum Server haben willst, dann stimmt das und es wird sogar noch besser:

Java hat in einer cacerts Datei die root Zertifikate, denen vertraut wird. Die notwendigen Root-Zertifikate sollten da schon enthalten sein.

Ich habe eben mal ein 8er Adopt OpenJDK geprüft (und Du kannst Deine Installationen auch prüfen):
- Im Installationsverzeichnis in jre/lib/securty wechseln
- "keytool -list -keystore cacerts" aufrufen (ggf. in eine Datei umleiten.
- Schauen, ob da Zertifikate von der Internet Security Research Group vorhanden sind (ISRG X1 und ISRG X2)

Wenn das der Fall ist, dann wird Letsencrypt bereits vertraut.
 

Joob

Top Contributor
Ach wie gut das ich gefragt habe und Du geduligt mein Missverständis aufgedeckt hast. Ist ja gar nicht kompliziert.

Das mit der list habe ich gemacht und auch mein letencrypt Zertifikat dem Keystore hinzugefügt.
Das ist ein wildcard Zertifikat, da müsste ich dann die host Names variieren können.

Ans laufen hatte ich das schon bekommen, aber ich hatte immer im Kopf das ich eine Konstruktion bauen müsste um es nach dem Renew auch noch verwenden zu können.

Das war mir eine riesen Hilfe. Schönen Dank.
 
K

kneitzel

Gast
auch mein letencrypt Zertifikat dem Keystore
Ich hoffe du meinst damit nicht das cacerts ... das wäre nur für root Zertifikate. So Du nicht unter die CAs gegangen bist, würde da Dein Zertifikat nicht rein gehören :)

Aber ich freue mich, wenn ich Dir etwas weiter helfen konnte.
 

Joob

Top Contributor
hier habe ich mein Zertifikat gespeichert und auch gefunden

keytool -list -keystore "C:\Program Files\Java\jdk-14.0.2\lib\security\cacerts" -storepass "changeit"

Java:
vitrain.online, 08.05.2021, trustedCertEntry,
Certificate fingerprint (SHA-256): xxxxxxxxxxxxxxxxxxxxxxxxxxx
xrampglobalca [jdk], 01.11.2004, trustedCertEntry,
Certificate fingerprint (SHA-256): xxxxxxxxxxxxxxxxxxxxxxxx

Ist das dann OK, ich meine wegen deiner Erwähnung des root Zertifikats.
 
K

kneitzel

Gast
Ja, da gehört es nicht rein. Das ist eine Liste von Zertifikaten von Certificate Authorities. Daher auch der Name cacerts.

Du musst Dein Zertifikat nur dem Server bekannt geben, damit dieser Verbindungen damit absichert. Für die Clients musst du nichts machen.
 

Joob

Top Contributor
Aber meine App lief erst nachdem ich die cert Datei aus dem Browser generiert hatte und dann die cert Datei mit :

Java:
keytool -import -alias vitrain.online -keystore "C:\Program Files\Java\jdk-14.0.2\lib\security\cacerts" -file "C:\Users\Jupp\Desktop\vitrain.cer" -storepass "changeit"
REM keytool -delete -noprompt -alias vitrain.online -keystore "C:\Program Files\Java\jdk-14.0.2\lib\security\cacerts" -storepass "changeit"

keytool -list -keystore "C:\Program Files\Java\jdk-14.0.2\lib\security\cacerts" -storepass "changeit"
pause

eingetragen habe, das oben ist meine Batch.
 

Joob

Top Contributor
Auf dem Server habe ich alles im webbrowser eingestellt. apache / sites-available / default-ssl.conf 000-default.conf
 
K

kneitzel

Gast
Hast du mal eine Seite im Browser geprüft? Zeigen die Browser die Seite richtig an oder kommt da ggf. auch eine Warnung?

Das ist ein guter Test um erst einmal zu sehen, ob der Webserver richtig konfiguriert wurde.

Typischer Fehler kann z.B. ein fehlendes Intermediate Zertifikat sein. Das würden aber die meisten Browser dann anzeigen weil dann der Trust auch im Browser nicht sicher gestellt sein kann.

Wenn du magst kann ich Dich da etwas durch führen. Der erste Test mit dem Webbrowser ist dann halt die Prüfung, wo wir schauen müssen: auf dem Server oder auf dem Client. Danach schauen wir dann gerne weiter.
 

Joob

Top Contributor
Im Browser habe ich die Domain eingegeben.
Dann kam die Default Seite von apache.
Auf dem Server habe ich ein redirect auf https .
Das klappt auch alles.
Dann habe ich im Browser das Zertifikat in einer Datei gespeichert.

Die Datei habe ich dann im KeyStore gespeichert, mit dem Batch welches ich Dir gezeigt habe.
Aber das wäre cool wenn du mir helfen könntest das zu verstehen und ein gutes Konzept aufzubauen.

Wann würde es Dir denn passen.
 
K

kneitzel

Gast
Heute kann ich da nichts mehr schauen, aber du kannst mir in einem Gespräch einmal die Domain sagen, dann schaue ich mir das einmal kurz an.

Wenn da alles ok ist, dann sehe ich, welches Root Zertifikat benötigt wird und können das prüfen (und ggf. hinzu fügen)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Socket Frage Netzwerkprogrammierung 6
T Frage bzgl. Socket-API Netzwerkprogrammierung 1
C Jetty 9 Non Blocking Handler Frage... Netzwerkprogrammierung 1
O log4j Appender Frage Netzwerkprogrammierung 6
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
C Frage zu Threads & Server Netzwerkprogrammierung 4
P Eine etwas andere Frage: Sicherheit Netzwerkprogrammierung 5
M allgemeine Frage über Server-Client-Kommunikation Netzwerkprogrammierung 5
M allgemeine Frage zu einem Web Service Client Netzwerkprogrammierung 2
Q Frage zur Socketprogrammierung Netzwerkprogrammierung 12
D HTTP Frage zu Login & Session ID Netzwerkprogrammierung 5
D HTTP nochne frage zu http requests Netzwerkprogrammierung 6
D "Fileserver" Frage + Mit Java zugreifen Netzwerkprogrammierung 9
S Socket-Frage zu einem LAN-Spiel. Netzwerkprogrammierung 3
Helgon Socket Socket IP Frage + Tutorial/Bücher Netzwerkprogrammierung 5
C Webservice Frage Netzwerkprogrammierung 2
M RMI Code Frage: Netzwerkprogrammierung 4
C Frage zur Klasse DatagramPacket Netzwerkprogrammierung 2
S Einfache Server Frage Netzwerkprogrammierung 5
xDarkSunx Kleine Frage authentifizierung Netzwerkprogrammierung 13
G Frage zu Servlets und deren Objekte + Bilder in Servlets anzeigen? Netzwerkprogrammierung 11
H Input-/OutputStream Frage Netzwerkprogrammierung 6
N Frage zu JNDI Netzwerkprogrammierung 2
B Frage zu einer Lösung (RMI) Netzwerkprogrammierung 2
X FAQ Frage - Netzwerkgrundlagen - ServerSocket und Socket Netzwerkprogrammierung 4
G Netzwerk IP Frage Netzwerkprogrammierung 4
S NanoHTTPD Server frage Netzwerkprogrammierung 5
E einfache Frage: wie Fehler untersuchen mit Tomcat Netzwerkprogrammierung 5
E Einfache Frage zu servlets und netbeans 6.5 Netzwerkprogrammierung 41
N Frage/Problem mit RMI Netzwerkprogrammierung 3
Kr0e Frage zu SO_TIMEOUT Netzwerkprogrammierung 3
K SCP und die Frage: Wie geh ich damit um? Netzwerkprogrammierung 7
K Frage zum Verhalten von SocketChannel.write(.) Netzwerkprogrammierung 9
G Frage zu Serversocket-Beispiel aus der FAQ Netzwerkprogrammierung 17
A Frage zur Verschlüsselung mit CipherInputStream Netzwerkprogrammierung 7
H Frage zu RMI Netzwerkprogrammierung 4
5 Grundlegende Design-Frage zu Webservices Netzwerkprogrammierung 16
C Frage zur ipcam WVC54GC von linksys ? Netzwerkprogrammierung 1
ven000m Mittlere Wartezeit Frage Netzwerkprogrammierung 5
T Frage bei Irc Verbindung Netzwerkprogrammierung 10
ven000m Frage aus einer mündl. Prüfung - wer kennt die Antwort? Netzwerkprogrammierung 6
S Serveranfrage - allgemeine Frage Netzwerkprogrammierung 2
ven000m Thread Frage Netzwerkprogrammierung 11
D Frage: Buffered Reader --> Wie komm ich an die Daten (Byt Netzwerkprogrammierung 3
H Frage zur Performance Netzwerkprogrammierung 10
flashfactor Frage zu HTML-Response Netzwerkprogrammierung 4
S GEHT DAS? - Nur eine Frage! (Printer Port direkt ansteuern?) Netzwerkprogrammierung 4
K Frage zu Net Send Netzwerkprogrammierung 7
G Frage zu JNDI / RMI Netzwerkprogrammierung 4
A ServerSocket prinzipielle Frage Netzwerkprogrammierung 5
M generelle Frage zum Versenden Netzwerkprogrammierung 4
L Frage nach Socket Netzwerkprogrammierung 4
E frage zu streams Netzwerkprogrammierung 2
Luma Verschiedene Frage zu nem Netzwerkprog Netzwerkprogrammierung 6
G einfache Frage zu ServerSocket ... Netzwerkprogrammierung 5
H p12 zertifikat in eigenen KeyStore importieren Netzwerkprogrammierung 2
R Socket SSL-Connect in Servlet - keystore wird nicht gefunden Netzwerkprogrammierung 2
faetzminator SSLSocket und keyStore/trustStore Netzwerkprogrammierung 2
S java keystore private und public key Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben