Wie bereits angekündigt werde ich in den nächsten Wochen einige Aspekte asymmetrischer Kryptographie beschreiben. Der vorliegende Artikel erläutert die Absicherung von Javas Remote Method Invocation (RMI).
Egentlich sollte es ja hier um asymmetrische Krypto gehen - RMI hat zunächst erst einmal nichts damit zu tun. Aber da RMI Remote Method Invocation bedeutet und es dabei darum geht, dass Objekte in unterschiedlichen Prozessen - die auch auf physisch verschiedenen, nur durch Netzwerk verbundenen - Rechnern ausgeführt werden miteinander interagieren und sich zum Beispiel gegenseitig aufrufen ist Cybersecurity eben inzwischen auch hier ein Thema.
Nun könnte man naiv herangehen und sagen: wenn zwei Prozesse miteinander Daten austauschen, kann man einfach einen TLS-Tunnel bauen und schon ist die Herausforderung keine mehr. Mit RMI ist das aber nicht so einfach: Zunächst erst einmal reden nicht die Prozesse miteinander, sondern die Objekte oder Instanzen: Je zwei davon öffnen eine Socketverbindung. Das heißt, dass sich zwischen zwei beliebigen RMI-Anwendungen sowohl die Anzahl von Verbindungen als auch die verwendeten Ports unterscheiden (können). Damit fällt die Idee eines Tunnels aus.
Hier zunächst einmal ein Diagramm, das einen Überblick über die komplexen Interaktionen in RMI-Anwendungen geben soll:
Zunächst muss der Serverprozess einmal Objekte zur Verfügung stellen, mit denen andere Prozesse interagieren sollen [1]. Diese Objekte müssen dann bei einer Registry publiziert werden [2]. So können Clientprozesse diese auffinden [3] und internen einen Stub erzeugen [6], mit dem der Client-Prozess redet [7] und der transparent die Kommunikation mit dem Server-Objekt übernimmt [8] und [9]. Zur Erstellung des Stubs ist es eventuell nötig, den Code für Klassen nachzuladen, der in der Clientanwendung nicht zur Verfügung steht (4) und (5). Daher gibt es bei RMI die Möglichkeit, einen Class-Server bereitzustellen, von dem die fehlenden Klassen nachgeladen werden können.
Fassen wir also zusammen, was alles per TLS abgesichert werden muss, um heutigen Erwartungen zum Stand der Technik zu genügen: Die Verbindungen zur Registry (im Diagramm rot gekennzeichnet) müssen ebenso abgesichert werden wie die zum Server, von dem fehlende Klassen nachgeladen werden sollen (im Diagramm blau) und die Verbindungen zwischen Server-Objekten und Stubs (im Diagramm grün). Das sind insgesamt drei Kommunikationskanäle.
Der erste ist der einfachste der drei: Der Server, der die Klassen zur Verfügung stellt kann als simpler HTTPS-Server realisiert werden.
Ein wenig mehr Aufwand und Planung benötigt die Absicherung der Kommunikation zwischen den Server-Objekten und den Stubs. Hier muss man zwei SSL SocketFactories bereitstellen (Client und Server authentifizieren sich jeweils über ihre Schlüssel und Zertifikate).
Das schwierigste Problem ist die Absicherung der Kommunikation mit der Registry: Der Lookup und die Registrierung von Objekten kann direkt über die API der Registry erfolgen oder alternativ (und im Mischbetrieb) via JNDI. Allerdings habe ich noch keine Möglichkeit gefunden, den Lookup per JNDI so zu konfigurieren, dass er TLS benutzt - hier wird immer unverschlüsselt kommuniziert. Da man eine Registry nur entweder plain oder TLS starten kann, funktioniert der Lookup über JNDI dann mit einer TLS-Registry nicht mehr. Man muss also - besonders wenn man bestehende RMI-Anwendungen per TLS absichern möchte genau nachsehen, ob der Lookup ausschließlich per Registry erfolgt, oder Teile der Anwendung dafür auf JNDI zurückgreifen. In diesem Fall muss man ein entsprechendes Refactoring einplanen oder die Kommunikation mit der Registry zähneknirschend erst einmal weiter unverschlüsselt belassen
Damit ist der Inhalt der folgenden Artikel in dieser Serie geklärt:
26.04.2026
Ich habe mich mit der Idee schon länger getragen: Nochmal einen Rundumschlag zu asymmetrischer Kryptographie zu machen. Dabei werde ich mich auf Demonstrationen der einzelnen Konzepte und Operationen mit Beispielcode konzentrieren und zu jedem der vorgestellten Konzepte mehr oder weniger ausführlich bezüglich der Einsatzszenarien und Vor- und Nachteile Stellung beziehen
26.04.2026
Wie bereits angekündigt werde ich in den nächsten Wochen erläutern, wie man im Java-Ökosystem RMI sicher betrieben kann.
Raspi Linkdump 2021 I
25.04.2021
Ein Linkdump rund um den Raspi
WeiterlesenAndroid Basteln C und C++ Chaos Datenbanken Docker dWb+ ESP Wifi Garten Geo Go GUI Hardware Java Jupyter JupyterBinder Komponenten Links Linux Markdown Markup Music Numerik OpenSource PKI-X.509-CA Präsentationen Python QBrowser Rants Raspi Revisited Security Software-Test sQLshell TeleGrafana Verschiedenes Video Virtualisierung Windows Upcoming...
Asymmetrische KryptographieIch habe mich mit der Idee schon länger getragen: Nochmal einen Rundumschlag zu asymmetrischer Kryptographie zu machen. Dabei werde ich mich auf Demonstrationen der einzelnen Konzepte und Operationen mit Beispielcode konzentrieren und zu jedem der vorgestellten Konzepte mehr oder weniger ausführlich bezüglich der Einsatzszenarien und Vor- und Nachteile Stellung beziehen
WeiterlesenWie bereits angekündigt werde ich in den nächsten Wochen erläutern, wie man im Java-Ökosystem RMI sicher betrieben kann.
WeiterlesenEine neue Version der sQLshell ist verfügbar!
WeiterlesenManche nennen es Blog, manche Web-Seite - ich schreibe hier hin und wieder über meine Erlebnisse, Rückschläge und Erleuchtungen bei meinen Hobbies.
Wer daran teilhaben und eventuell sogar davon profitieren möchte, muss damit leben, daß ich hin und wieder kleine Ausflüge in Bereiche mache, die nichts mit IT, Administration oder Softwareentwicklung zu tun haben.
Ich wünsche allen Lesern viel Spaß und hin und wieder einen kleinen AHA!-Effekt...
PS: Meine öffentlichen Codeberg-Repositories findet man hier.