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.
Dzięki! bardzo doceniona pomoc. – cmidi