SSL_shutdown korrekt behandeln

8

Die openssl-Dokumentation zu SSL_shutdown besagt Folgendes: Es wird daher empfohlen, den Rückgabewert von SSL_shutdown () zu überprüfen und SSL_shutdown () erneut aufzurufen, wenn das bidirektionale Herunterfahren noch nicht abgeschlossen ist (Rückgabewert des ersten Aufrufs ist 0).

Ссылка

Ich habe unten ein Code-Snippet, wo ich nach dem Rückgabewert 0 von SSL_shutdown suche und es wieder anrufe, was ich benutzt habe. Meine Frage ist, ob es in Ordnung ist, den Rückgabewert von SSL_shutdown beim zweiten Aufruf zu ignorieren oder wir sollten SSL_shutdown wiederholen, bis eine 1 (bidirektionales Herunterfahren abgeschlossen) zurückgegeben wird.

%Vor%     
cmidi 20.01.2015, 22:08
quelle

1 Antwort

11

openssl ist ein bisschen wie eine dunkle Kunst.

Erstens hat die Seite, auf die Sie verwiesen haben, die Rückgabewerte schlecht geschrieben. Hier ist, was die Man-Page eigentlich sagt:

%Vor%

Wenn Sie blockierende BIOs haben, sind die Dinge relativ einfach. Eine 0 beim ersten Aufruf bedeutet, dass Sie SSL_shutdown erneut aufrufen müssen, wenn Sie eine bidirektionale Abschaltung wünschen. Eine 1 bedeutet, dass du fertig bist. A -1 bedeutet einen Fehler. Beim zweiten Anruf (den Sie nur machen, wenn Sie eine 0 zurückbekommen haben), wird eine bidirektionale Abschaltung eingeleitet. Logik diktiert, dass Sie keine 0 wieder zurückbekommen können (weil es eine blockierende BIO ist und den ersten Schritt abgeschlossen haben wird). A -1 zeigt einen Fehler an und eine 1 zeigt den Abschluss an.

Wenn Sie nicht blockierende BIOs haben, gilt das Gleiche, abgesehen von der Tatsache, dass Sie die gesamte SSL_ERROR_WANT_READ und SSL_ERROR_WANT_WRITE rigmarole durchgehen müssen, d. h .:

%Vor%

Sie haben also zwei Ebenen der Wiederholung. Sie rufen SSL_shutdown die 'erste' Zeit auf, aber wiederholen Sie, wenn Sie SSL_ERROR_WANT_READ oder SSL_ERROR_WANT_WRITE erhalten, nachdem Sie die select() -Schleife normal durchlaufen haben, und zählen Sie nur die 'erste' SSL_shutdown als erledigt ein nicht SSL_ERROR_WANT_ Fehlercode (in diesem Fall ist es fehlgeschlagen), oder Sie erhalten eine 0 oder 1 return. Wenn du 1 return bekommst, hast du es geschafft. Wenn Sie 0 return erhalten und ein bidirektionales Herunterfahren möchten, müssen Sie den zweiten Aufruf ausführen, bei dem Sie erneut nach SSL_ERROR_WANT_READ oder SSL_ERROR_WANT_WRITE suchen und versuchen müssen, erneut auszuwählen. das sollte 1 nicht zurückgeben, aber 0 oder einen Fehler zurückgeben.

Nicht einfach.

    
abligh 20.01.2015, 22:41
quelle

Tags und Links