Absichern von RMI mittels TLS

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:

  • Sicheres Nachladen von Klassen aus einer JVM in eine andere mittels dediziertem HTTPS-Server
  • Kommunikation zwischen Server-Objekten und Stubs abgesichert per TLS
  • Betrieb einer mittels TLS abgesicherten Registry
  • Refactoring von JNDI hin zu direkter Benutzung der Registry für Binding und Lookup in der OpenSource Bibliothek t(ransparent)RMI

Artikel, die hierher verlinken

PlantUML Text Encoding in Bash

16.08.2026

Ich habe neulich darüber geschrieben, dass ich mit in meinem Homelab von Gitlab verabschieden möchte und nach Alternativen gesucht habe. Bei meiner Suche stieß ich auf verteilte Issue Tracker, die die vertraute Integration von PlantUML nicht bieten. Daher suchte ich nach einem Weg, auch dieses Feature in solchen Lösungen zu integrieren.

Asymmetrische Kryptographie

25.05.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

t(ransparent) RMI over TLS

11.05.2026

Wie bereits angekündigt werde ich in den nächsten Wochen erläutern, wie man im Java-Ökosystem RMI sicher betrieben kann.

RMI und TLS

07.05.2026

Wie bereits angekündigt werde ich in den nächsten Wochen erläutern, wie man im Java-Ökosystem RMI sicher betrieben kann.

ClassLoader für RMI über TLS

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.

Alle Artikel rss Wochenübersicht Monatsübersicht Codeberg Repositories Mastodon Über mich home xmpp


Vor 5 Jahren hier im Blog

  • Zertifikatsgültigkeit überwachen mit Grafana

    04.10.2021

    Ich habe ausprobiert, die verbleibende Lebenszeit von X.509-Zertifikaten per Telegraf, Influx und Grafana zu überwachen

    Weiterlesen

Neueste Artikel

  • Fallstudie elektronische Signatur

    Ein Influenzer würde einen solchen Artikel beginnen mit "Ich werde immer wieder gefragt, warum..." Da ich keiner bin kann ich so etwas nicht tun – statt dessen erläutere ich einfach das Szenario: Ich pflege diverse Open Source Projekte, die sich mit PKI und kryptographischen Timestamps. Jedoch benutzt die sQLshell elektronische Signaturen nur für die Verteilung der diversen Plugins.

    Weiterlesen
  • Elektronische Signaturen zur Absicherung bei der Migration

    Ich habe bisher einen Aspekt absichtlich und gewissenhaft aus der sQLshell herausgelassen, mich aber jetzt - wo die Zahl der gefundenen Sicherheitslücken in allen möglichen Produkten immer mehr zunimmt - doch einmal damit beschäftigt...

    Weiterlesen
  • Dynamiken im stretch-twist-fold System

    Ich habe wieder einmal ein System nichtlinearer Differentialgleichungen entdeckt, das ich noch nicht kannte und einige Experimente damit durchgeführt...

    Weiterlesen

Manche 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.