Donnerstag, 7. August 2008

Auswirkung von Web Service Security auf die Performance

Beim Testen der Fähigkeiten des neuen Netbeans 6.5 MS1stellte sich uns die Frage, welchen Einfluss das Signieren und Verschlüsseln von Web Services mit dem Standard Web Services Security auf die Performance hat.
Zur Klärung der Frage implementierten wir einen einfachen Web Service mit Metro in Netbeans. Der Web Service beinhaltet eine einzelne Methode, die dazu dient Anfragen entgegen zu nehmen ohne diese weiter zu verarbeiten.
Bei unseren ersten Tests lag die Roundtrip-Zeit des ungesicherten Web Service bei ca. 40ms für eine einzelne Anfrage, was bei einem Notebook mit 2.000Mhz CPU mit 2GB RAM entschieden zu lange dauerte. Die Ursache hierfür war der aktivierte HTTP Monitor des Glassfish Servers.
Nach Deaktivierung des Monitors erreichten wir eine Roundtrip-Zeit von unter 4ms für eine einzelne Anfrage, dies entsprach unseren eigentlichen Erwartungen.
Zum Verschlüsseln des Web Service wählten wir die von Netbeans angebotene Methode „Username Authentication with symmetric Key“, die ein X509 Token zur Autehntifizeirung, sowie einen 128 bit Algorithmus zur Verschlüsselung der Übertrageung verwendet. Der Client verschlüsselt den symmetrischen Key mit dem öffentlichen Schlüssel des Service:

encryptedKey=encrypt(publicKeyServer, symKey)

Der Server bekommt den symmetrischen Schlüssel durch das Entschlüsseln mit seinem privaten Schlüssel:

symKey=decrypt(privateKeyServer, encryptedKey)

Die public/private Key Verschlüsselung wird nur für den wenige Bytes großen symmetreischen Schlüssel verwendet. Die Payload der Nachricht wird mit dem symmetrischen Key verschlüsselt, welcher nun beiden Seiten bekannt ist. Bei großen Nachrichten wird durch die schnelle symmetrische Verschlüsselung Zeit und Rechenleistung gespart. Je größer die Nachricht ist, desto mehr kann der Zeitaufwand für das Verschlüsseln vernachlässigt werden. Da es sich in unserem Beispiel um eine sehr kurze Nachricht handelte, hatte das symmetrische Verfahren keinen messbaren Vorteil. Die verschlüsselte Variante des Service stellte daher mit ca. 45ms Roundtrip-Zeit ein erwartet unbefriedigendes Ergebnis dar. Als nächstes wollten wir Testen, ob die Etablierung eines sicheren Kontextes mit WS-SecureConversation zu besseren Ergebnissen führt, da nicht mit jeder Nachricht erneut der symmetrische Schlüssel übertragen und entschlüsselt werden muss.
In Netbeans lässt sich dies sehr einfach durch Setzen eines einzigen Häkchens realisieren.
Das Ergebnis enttäuschte jedoch mit 35ms. Begründet darin, dass immer noch jede Nachricht mit einem private und public Key signiert wird, versuchten wir das Signieren zu deaktivieren. Leider ist es mit Netbeans bisher nicht möglich auf die Signierung der Nachrichten zu verzichten. Auch eine Anpassung der in WSDL eingebettete Policies brachte nichts. Hier bleibt nur die Hoffnung auf Nachbesserung Seitens der Netbeans-Entwickler, da es sich bei dem Web Service Security Standard ja immer noch um eine relativ neue Technologie handelt. Erst dann könnten Roundtrip-Zeiten der Größenordnung von unverschlüsselten Nachrichten erreicht werden.