Java RMI + SSL + Komprimierung = UNMÖGLICH!

8

Ich habe RMI + SSL eingerichtet. Das funktioniert großartig. Es scheint jedoch nicht möglich zu sein, die Komprimierung zwischen RMI und SSL zu verschieben. Damit die RMI-Anforderungen komprimiert werden, bevor sie über SSL gesendet werden.

Ich habe einige Posts im Internet gesehen, die vorschlagen, dass SSLSocketFactory.createSocket() einen Socket verwendet, um SSL über einen komprimierenden Socket zu übertragen. Aber das scheint so zu sein, als würde es versuchen, das SSL-Protokoll selbst zu komprimieren, das wahrscheinlich nicht sehr komprimierbar ist.

Ich sollte einen Socket -proxy erstellen (Unterklasse von Socket , die auf ein anderes Socket verweist, wie FilterOutputStream ). Lassen Sie den Proxy die Input / Output-Streams mit Komprimierung umschließen. Und meine SocketFactory und ServerSocketFactory geben die Proxies zurück und wickeln die SSLSocket ein.

Aber dann haben wir das Pufferproblem. Die Komprimierung puffert die Daten, bis sie ausreichend komprimiert werden können, oder sie werden angewiesen, zu spülen. Dies ist in Ordnung, wenn Sie keine Hin-und-Her-Kommunikation über den Socket haben. Aber mit zwischengespeicherten Sockets in RMI haben Sie das. Es gibt keine Möglichkeit, das Ende einer RMI-Anforderung zu identifizieren, sodass Sie Ihre komprimierten Daten löschen können.

Sun hat ein RMISocketFactory -Beispiel, das so etwas tut, aber das überhaupt nicht anspricht.

Notizen:
1. SSL unterstützt die Komprimierung, aber ich kann nichts über die Aktivierung in JSSE finden 2. Ich weiß, dass die Komprimierung auf viele kleine nicht zusammenhängende Blöcke (wie RMI normalerweise besteht) nicht sehr vorteilhaft ist 3. Ich weiß, dass RMI nicht die beste Wahl ist, wenn ich große Anfragen sende 4. Es gibt ein SSLRMISocketFactory in Java 6. Aber es fügt nichts über meine benutzerdefinierte Implementierung hinzu.

    
DragonFax 03.03.2010, 19:39
quelle

1 Antwort

25
___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ tag123compression ___ Der Name, der dem Prozess zum Codieren von Daten gegeben wird, sodass er im Vergleich zur ursprünglichen Darstellung eine geringere Anzahl von Bits verwendet. ___ qstnhdr ___ Java RMI + SSL + Komprimierung = UNMÖGLICH! ___ tag123rpc ___ Remote Procedure Call (RPC) ist ein Ansatz für die Interprozessor- oder verteilte Kommunikation, bei dem eine Reihe von Diensten oder Prozeduren für entfernte Clients verfügbar gemacht wird. RPC ist sowohl ein allgemeines Konzept für die Kommunikation zwischen Prozessoren als auch eine Abkürzung für die ursprüngliche Implementierung von Sun (im Folgenden SunRPC genannt). ___ tag123rmi ___ Remote Method Invocation (RMI) ist der objektorientierte RPC-Mechanismus (Remote Procedure Call) von Java. ___ qstntxt ___

Ich habe RMI + SSL eingerichtet. Das funktioniert großartig. Es scheint jedoch nicht möglich zu sein, die Komprimierung zwischen RMI und SSL zu verschieben. Damit die RMI-Anforderungen komprimiert werden, bevor sie über SSL gesendet werden.

Ich habe einige Posts im Internet gesehen, die vorschlagen, dass Socket einen Socket verwendet, um SSL über einen komprimierenden Socket zu übertragen. Aber das scheint so zu sein, als würde es versuchen, das SSL-Protokoll selbst zu komprimieren, das wahrscheinlich nicht sehr komprimierbar ist.

Ich sollte einen SocketImpl -proxy erstellen (Unterklasse von StreamPair , die auf ein anderes RMISocketFactory verweist, wie wrap ). Lassen Sie den Proxy die Input / Output-Streams mit Komprimierung umschließen. Und meine wrap und wrap geben die Proxies zurück und wickeln die Socket ein.

Aber dann haben wir das Pufferproblem. Die Komprimierung puffert die Daten, bis sie ausreichend komprimiert werden können, oder sie werden angewiesen, zu spülen. Dies ist in Ordnung, wenn Sie keine Hin-und-Her-Kommunikation über den Socket haben. Aber mit zwischengespeicherten Sockets in RMI haben Sie das. Es gibt keine Möglichkeit, das Ende einer RMI-Anforderung zu identifizieren, sodass Sie Ihre komprimierten Daten löschen können.

Sun hat ein isConnected -Beispiel, das so etwas tut, aber das überhaupt nicht anspricht.

Notizen:
1. SSL unterstützt die Komprimierung, aber ich kann nichts über die Aktivierung in JSSE finden 2. Ich weiß, dass die Komprimierung auf viele kleine nicht zusammenhängende Blöcke (wie RMI normalerweise besteht) nicht sehr vorteilhaft ist 3. Ich weiß, dass RMI nicht die beste Wahl ist, wenn ich große Anfragen sende 4. Es gibt ein true in Java 6. Aber es fügt nichts über meine benutzerdefinierte Implementierung hinzu.

    
___ tag123ssl ___ Secure Sockets Layer (SSL) ist ein kryptografisches Protokoll, das sichere Kommunikation über das Internet ermöglicht. Häufig wird SSL als Oberbegriff verwendet und bezieht sich sowohl auf das SSL-Protokoll als auch auf das TLS-Protokoll (Transport Layer Security). Die neueste Version des Protokolls ist TLS Version 1.2, spezifiziert von der IETF in RFC 5246. ___
Paŭlo Ebermann 04.06.2011 00:00
quelle

Tags und Links