mirror of https://github.com/openssl/openssl.git
				
				
				
			
		
			
				
	
	
		
			178 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			178 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
=pod
 | 
						|
 | 
						|
=head1 NAME
 | 
						|
 | 
						|
SSL_shutdown - shut down a TLS/SSL connection
 | 
						|
 | 
						|
=head1 SYNOPSIS
 | 
						|
 | 
						|
 #include <openssl/ssl.h>
 | 
						|
 | 
						|
 int SSL_shutdown(SSL *ssl);
 | 
						|
 | 
						|
=head1 DESCRIPTION
 | 
						|
 | 
						|
SSL_shutdown() shuts down an active TLS/SSL connection. It sends the
 | 
						|
close_notify shutdown alert to the peer.
 | 
						|
 | 
						|
SSL_shutdown() tries to send the close_notify shutdown alert to the peer.
 | 
						|
Whether the operation succeeds or not, the SSL_SENT_SHUTDOWN flag is set and
 | 
						|
a currently open session is considered closed and good and will be kept in the
 | 
						|
session cache for further reuse.
 | 
						|
 | 
						|
Note that SSL_shutdown() must not be called if a previous fatal error has
 | 
						|
occurred on a connection i.e. if SSL_get_error() has returned SSL_ERROR_SYSCALL
 | 
						|
or SSL_ERROR_SSL.
 | 
						|
 | 
						|
The shutdown procedure consists of two steps: sending of the close_notify
 | 
						|
shutdown alert, and reception of the peer's close_notify shutdown alert.
 | 
						|
The order of those two steps depends on the application.
 | 
						|
 | 
						|
It is acceptable for an application to only send its shutdown alert and
 | 
						|
then close the underlying connection without waiting for the peer's response.
 | 
						|
This way resources can be saved, as the process can already terminate or
 | 
						|
serve another connection.
 | 
						|
This should only be done when it is known that the other side will not send more
 | 
						|
data, otherwise there is a risk of a truncation attack.
 | 
						|
 | 
						|
When a client only writes and never reads from the connection, and the server
 | 
						|
has sent a session ticket to establish a session, the client might not be able
 | 
						|
to resume the session because it did not received and process the session ticket
 | 
						|
from the server.
 | 
						|
In case the application wants to be able to resume the session, it is recommended to
 | 
						|
do a complete shutdown procedure (bidirectional close_notify alerts).
 | 
						|
 | 
						|
When the underlying connection shall be used for more communications, the
 | 
						|
complete shutdown procedure must be performed, so that the peers stay
 | 
						|
synchronized.
 | 
						|
 | 
						|
SSL_shutdown() only closes the write direction.
 | 
						|
It is not possible to call SSL_write() after calling SSL_shutdown().
 | 
						|
The read direction is closed by the peer.
 | 
						|
 | 
						|
The behaviour of SSL_shutdown() additionally depends on the underlying BIO.
 | 
						|
If the underlying BIO is B<blocking>, SSL_shutdown() will only return once the
 | 
						|
handshake step has been finished or an error occurred.
 | 
						|
 | 
						|
If the underlying BIO is B<nonblocking>, 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 B<SSL_ERROR_WANT_READ> or
 | 
						|
B<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 nonblocking 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.
 | 
						|
 | 
						|
After SSL_shutdown() returned 0, it is possible to call SSL_shutdown() again
 | 
						|
to wait for the peer's close_notify alert.
 | 
						|
SSL_shutdown() will return 1 in that case.
 | 
						|
However, it is recommended to wait for it using SSL_read() instead.
 | 
						|
 | 
						|
SSL_shutdown() can be modified to only set the connection to "shutdown"
 | 
						|
state but not actually send the close_notify alert messages,
 | 
						|
see L<SSL_CTX_set_quiet_shutdown(3)>.
 | 
						|
When "quiet shutdown" is enabled, SSL_shutdown() will always succeed
 | 
						|
and return 1.
 | 
						|
Note that this is not standard compliant behaviour.
 | 
						|
It should only be done when the peer has a way to make sure all
 | 
						|
data has been received and doesn't wait for the close_notify alert
 | 
						|
message, otherwise an unexpected EOF will be reported.
 | 
						|
 | 
						|
There are implementations that do not send the required close_notify alert.
 | 
						|
If there is a need to communicate with such an implementation, and it's clear
 | 
						|
that all data has been received, do not wait for the peer's close_notify alert.
 | 
						|
Waiting for the close_notify alert when the peer just closes the connection
 | 
						|
will result in an error being generated.
 | 
						|
The error can be ignored using the B<SSL_OP_IGNORE_UNEXPECTED_EOF>.
 | 
						|
For more information see L<SSL_CTX_set_options(3)>.
 | 
						|
 | 
						|
=head2 First to close the connection
 | 
						|
 | 
						|
When the application is the first party to send the close_notify
 | 
						|
alert, SSL_shutdown() will only send the alert and then set the
 | 
						|
SSL_SENT_SHUTDOWN flag (so that the session is considered good and will
 | 
						|
be kept in the cache).
 | 
						|
If successful, SSL_shutdown() will return 0.
 | 
						|
 | 
						|
If a unidirectional shutdown is enough (the underlying connection shall be
 | 
						|
closed anyway), this first successful call to SSL_shutdown() is sufficient.
 | 
						|
 | 
						|
In order to complete the bidirectional shutdown handshake, the peer needs
 | 
						|
to send back a close_notify alert.
 | 
						|
The SSL_RECEIVED_SHUTDOWN flag will be set after receiving and processing
 | 
						|
it.
 | 
						|
 | 
						|
The peer is still allowed to send data after receiving the close_notify
 | 
						|
event.
 | 
						|
When it is done sending data, it will send the close_notify alert.
 | 
						|
SSL_read() should be called until all data is received.
 | 
						|
SSL_read() will indicate the end of the peer data by returning <= 0
 | 
						|
and SSL_get_error() returning SSL_ERROR_ZERO_RETURN.
 | 
						|
 | 
						|
=head2 Peer closes the connection
 | 
						|
 | 
						|
If the peer already sent the close_notify alert B<and> it was
 | 
						|
already processed implicitly inside another function
 | 
						|
(L<SSL_read(3)>), the SSL_RECEIVED_SHUTDOWN flag is set.
 | 
						|
SSL_read() will return <= 0 in that case, and SSL_get_error() will return
 | 
						|
SSL_ERROR_ZERO_RETURN.
 | 
						|
SSL_shutdown() will send the close_notify alert, set the SSL_SENT_SHUTDOWN
 | 
						|
flag.
 | 
						|
If successful, SSL_shutdown() will return 1.
 | 
						|
 | 
						|
Whether SSL_RECEIVED_SHUTDOWN is already set can be checked using the
 | 
						|
SSL_get_shutdown() (see also L<SSL_set_shutdown(3)> call.
 | 
						|
 | 
						|
=head1 RETURN VALUES
 | 
						|
 | 
						|
The following return values can occur:
 | 
						|
 | 
						|
=over 4
 | 
						|
 | 
						|
=item Z<>0
 | 
						|
 | 
						|
The shutdown is not yet finished: the close_notify was sent but the peer
 | 
						|
did not send it back yet.
 | 
						|
Call SSL_read() to do a bidirectional shutdown.
 | 
						|
 | 
						|
Unlike most other function, returning 0 does not indicate an error.
 | 
						|
L<SSL_get_error(3)> should not get called, it may misleadingly
 | 
						|
indicate an error even though no error occurred.
 | 
						|
 | 
						|
=item Z<>1
 | 
						|
 | 
						|
The shutdown was successfully completed. The close_notify alert was sent
 | 
						|
and the peer's close_notify alert was received.
 | 
						|
 | 
						|
=item E<lt>0
 | 
						|
 | 
						|
The shutdown was not successful.
 | 
						|
Call L<SSL_get_error(3)> with the return value B<ret> to find out the reason.
 | 
						|
It can occur if an action is needed to continue the operation for nonblocking
 | 
						|
BIOs.
 | 
						|
 | 
						|
It can also occur when not all data was read using SSL_read().
 | 
						|
 | 
						|
=back
 | 
						|
 | 
						|
=head1 SEE ALSO
 | 
						|
 | 
						|
L<SSL_get_error(3)>, L<SSL_connect(3)>,
 | 
						|
L<SSL_accept(3)>, L<SSL_set_shutdown(3)>,
 | 
						|
L<SSL_CTX_set_quiet_shutdown(3)>, L<SSL_CTX_set_options(3)>
 | 
						|
L<SSL_clear(3)>, L<SSL_free(3)>,
 | 
						|
L<ssl(7)>, L<bio(7)>
 | 
						|
 | 
						|
=head1 COPYRIGHT
 | 
						|
 | 
						|
Copyright 2000-2020 The OpenSSL Project Authors. All Rights Reserved.
 | 
						|
 | 
						|
Licensed under the Apache License 2.0 (the "License").  You may not use
 | 
						|
this file except in compliance with the License.  You can obtain a copy
 | 
						|
in the file LICENSE in the source distribution or at
 | 
						|
L<https://www.openssl.org/source/license.html>.
 | 
						|
 | 
						|
=cut
 |