2015-01-20 3 views
8

Dokumentacja openssl dotycząca SSL_shutdown stwierdza, że: Dlatego zaleca się, aby sprawdzić wartość zwracaną przez SSL_shutdown() i ponownie wywołać funkcję SSL_shutdown(), jeśli zamknięcie dwukierunkowe nie zostało jeszcze zakończone (wartość zwracana pierwszego call to 0).Obsługa poprawnie SSL_shutdown

https://www.openssl.org/docs/ssl/SSL_shutdown.html

Mam fragment kodu poniżej, gdzie mogę sprawdzić wartość zwracana 0 z SSL_shutdown i nazywają to kolejny, który używam. Moje pytanie brzmi, czy można zignorować wartość zwracaną przez SSL_shutdown w drugim wywołaniu lub powinniśmy kontynuować ponawianie próby SSL_shutdown do momentu zwrócenia 1 (zakończenie dwukierunkowego zakończenia).

int r = SSL_shutdown(ssl); 
//error handling here if r < 0 
if(!r) 
{ 

    shutdown(fd,1); 
    SSL_shutdown(ssl); //how should I handle return value and error handling here is it required?? 
} 
SSL_free(ssl); 
SSLMap.erase(fd); 
shutdown(fd,2); 
close(fd); 

Odpowiedz

11

openssl jest nieco ciemnego techniki.

Po pierwsze, strona, do której się odwołałeś, źle odczytuje wartości zwracane przez HTML. Oto, co człowiek-strona faktycznie mówi:

RETURN VALUES 

    The following return values can occur: 

    0 The shutdown is not yet finished. Call SSL_shutdown() for a second 
     time, if a bidirectional shutdown shall be performed. The output 
     of SSL_get_error(3) may be misleading, as an erroneous 
     SSL_ERROR_SYSCALL may be flagged even though no error occurred. 

    1 The shutdown was successfully completed. The "close notify" alert 
     was sent and the peer's "close notify" alert was received. 

    -1 The shutdown was not successful because a fatal error occurred 
     either at the protocol level or a connection failure occurred. It 
     can also occur if action is need to continue the operation for non- 
     blocking BIOs. Call SSL_get_error(3) with the return value ret to 
     find out the reason. 

Jeśli blokowania bios, rzeczy są stosunkowo proste. Wartość 0 w pierwszym wywołaniu oznacza, że ​​musisz ponownie zadzwonić pod numer SSL_shutdown, jeśli chcesz uzyskać dwukierunkowe zamknięcie. A 1 oznacza, że ​​skończyłeś. A -1 oznacza błąd. Przy drugim wywołaniu (które robisz tylko wtedy, gdy masz 0 z powrotem), inicjowane jest dwukierunkowe wyłączanie. Logika nakazuje, że nie można uzyskać ponownie 0 (ponieważ jest to blokujący BIO i zakończy pierwszy krok). A -1 oznacza błąd, a 1 oznacza zakończenie.

Jeśli masz bios non-blocking, to samo dotyczy, z wyjątkiem faktu, trzeba przejść przez cały SSL_ERROR_WANT_READ i SSL_ERROR_WANT_WRITE żmudną procedurę, tj .:

If the underlying BIO is non-blocking, SSL_shutdown() will also return 
    when the underlying BIO could not satisfy the needs of SSL_shutdown() 
    to continue the handshake. In this case a call to SSL_get_error() with 
    the return value of SSL_shutdown() will yield SSL_ERROR_WANT_READ or 
    SSL_ERROR_WANT_WRITE. The calling process then must repeat the call 
    after taking appropriate action to satisfy the needs of SSL_shutdown(). 
    The action depends on the underlying BIO. When using a non-blocking 
    socket, nothing is to be done, but select() can be used to check for 
    the required condition. When using a buffering BIO, like a BIO pair, 
    data must be written into or retrieved out of the BIO before being able 
    to continue. 

więc masz dwa poziomy powtórzenia. Wywołujesz SSL_shutdown "pierwszy" czas, ale powtórz, jeśli dostaniesz SSL_ERROR_WANT_READ lub SSL_ERROR_WANT_WRITE po obejściu pętli select() w normalny sposób i zliczymy tylko "pierwszy" SSL_shutdown jak zrobić, jeśli otrzymasz kod błędu inny niż SSL_ERROR_WANT_ (w takim przypadku nie powiodło się) lub otrzymasz zwrot w postaci 0 lub. Jeśli otrzymasz zwrot o wartości 1, skończyłeś. Jeśli otrzymasz zwrot 0 i chcesz uzyskać dwukierunkowe zamknięcie, musisz wykonać drugie połączenie, na którym ponownie musisz sprawdzić na SSL_ERROR_WANT_READ lub SSL_ERROR_WANT_WRITE i spróbować ponownie; to nie powinno zwracać 1, ale może zwrócić 0 lub błąd.

Nie jest to proste.

+0

Dzięki! bardzo doceniona pomoc. – cmidi