Ich möchte OpenSSL für die Handhabung unserer gesamten SSL-Kommunikation (Client- und Serverseite) verwenden. Wir möchten die HW-Beschleunigungskarte zum Entladen der schweren kryptografischen Berechnungen verwenden.
Wir haben festgestellt, dass es im OpenSSL-Geschwindigkeitstest direkte Aufrufe der kryptografischen Funktionen gibt (z. B. RSA_sign/decrypt
usw.). Um die HW-Kapazität voll auszunutzen, wurden mehrere Threads benötigt (bis zu 128 Threads), die die Karte mit Anfragen laden und sicherstellen, dass die HW-Karte niemals inaktiv ist.
Wir würden gerne die High-Level-OpenSSL-API für die Verarbeitung von SSL-Verbindungen verwenden (z. B. SSL_connect/read/write/accept
), aber diese API stellt den Punkt, an dem die eigentliche kryptografische Operation ausgeführt wird, nicht zur Verfügung. Wenn wir zum Beispiel SSL_connect
aufrufen, ist uns der Punkt, an dem die RSA-Operationen ausgeführt werden, nicht bekannt, und wir wissen nicht im Voraus, welche Aufrufe zu schweren kryptografischen Berechnungen führen und nur diese auf den Beschleuniger beziehen.
Fragen:
AKTUALISIEREN
Von Accelerating OpenSSL * Using Intel® QuickAssist Technologie sieht man, dass Intel auch die Verwendung mehrerer Threads / Prozesse erwähnt:
Die Standardversion von OpenSSL ist seriell in der Natur und bedeutet es behandelt eine Verbindung in einem Kontext. Aus der Sicht von kryptographischen Operationen basiert die Freigabe auf einem synchronen blockierendes Programmiermodell. Eine große Einschränkung ist der Durchsatz höher skaliert werden, indem nur mehr Threads (d. h. Prozesse) hinzugefügt werden Vorteil der Kernparallelisierung, aber dies wird auch den Kontext erhöhen Verwaltungsaufwand.
Der OpenSSL-Zweig von Intel wird schließlich hier gefunden. Weitere Informationen finden Sie im PDF enthaltenen hier .
Es sieht so aus, als ob Intel die Funktionsweise von OpenSSL ENGINE geändert hat - es sendet Arbeit an den Treiber und kehrt sofort zurück, während das entsprechende Ergebnis abgefragt werden muss.
Wenn Sie einen anderen SSL-Beschleuniger verwenden, sollte auch der entsprechende OpenSSL ENGINE geändert werden.
Laut Interpretieren der OpenSSL-Geschwindigkeit Ausgabe für RSA mit Multi-Option , -multi
"arbeitet nicht parallel" oder so, es werden nur mehrere Benchmarks parallel ausgeführt.
Die Belastung Ihrer HW-Karte wird im Wesentlichen dadurch begrenzt, wie viel Arbeit zur Zeit verfügbar ist (beachten Sie, dass in der Industrie im Allgemeinen 80% geplante Kapazitätslast im Falle von Lastspitzen als optimal betrachtet wird). Wenn Sie mehrere Server-Threads / Prozesse ausführen, erhalten Sie natürlich denselben Effekt wie mehrere Benchmarks.
OpenSSL unterstützt mehrere Threads, sofern Sie Rückrufe zum Sperren von freigegebenen Daten bereitstellen . Für mehrere Prozesse warnt es vor dem Wiederverwenden des Datenstatus , der von Parent übernommen wurde.
Das ist es für die vertikale Skalierung. Für horizontale Skalierung:
openssl
unterstützt asynchrone E / A durch asynchrone BIOs Intel hat "Asynchronous OpenSSL" angekündigt Projekt (08.2014) mit seiner Hardware zu verwenden, aber Das verlinkte Whitepaper gibt wenig Details über die Implementierung und den Entwicklungsstand. Ein Entwickler veröffentlichte einen verwandten Code (10.2015) und bemerkte, dass er "stabil genug ist um einen Überblick zu bekommen ".
Wie jww in den Kommentaren erwähnt wurde, sollten Sie das engine API , um die Aufgabe zu erfüllen. Im obigen Link finden Sie ein Beispiel für die Verwendung dieser API. Normalerweise implementiert der Hardwarebeschleunigeranbieter eine Bibliothek, die als "ENGINE" bezeichnet wird. Diese Engine stellt eine kryptografische Beschleunigung bereit und kann von OpenSSL intern verwendet werden. Vorausgesetzt, dass der Beschleuniger, den Sie verwenden möchten, einen ENGINE implementiert hat (zB "cswitft"), sollten Sie die Engine abrufen, indem Sie ENGINE *e = ENGINE_by_id("cswift");
aufrufen und dann ENGINE_init(e);
initialisieren und als Standard für die Operationen festlegen, die Sie verwenden möchten zB ENGINE_set_default_RSA(e);
Nach dem Aufruf dieser Funktionen können Sie die High-Level-API von OpenSSL (z. B. SSL_connect/read/write/accept
)
Tags und Links multithreading ssl performance openssl hardware-acceleration