Nutzung des HW-Beschleunigers

9

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:

  1. Wie kann ich die High-Level-API nutzen, während ich den HW-Beschleuniger noch voll ausnutze? Sollte ich mehrere Threads verwenden?
  2. Gibt es einen "normalen" Weg, dies zu tun? (Implementierungsbeispiel)
  3. (Antwort in UPDATE) Kennen Sie sich mit Intels asynchrones OpenSSL ? Es scheint, dass sie versuchten, genau dieses Problem zu lösen, aber wir können den tatsächlichen Code oder die Anwendungsbeispiele nicht finden.

AKTUALISIEREN

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

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

dimba 07.10.2015, 14:29
quelle

2 Antworten

3

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
  • aber seine elementaren Crypto-Operationen und internen ENGINE-Aufrufe sind synchron, und das zu ändern würde eine logische Überarbeitung erfordern
  • private Bemühungen, sie asynchronen Betrieb zu ermöglichen haben schwere Kritik getroffen aufgrund der großen Design Fehler

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

    
ivan_pozdeev 20.10.2015, 22:18
quelle
1

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 )

verwenden     
borisp 10.10.2015 08:26
quelle