1 | =pod
|
---|
2 |
|
---|
3 | =head1 NAME
|
---|
4 |
|
---|
5 | SSL_shutdown, SSL_shutdown_ex - shut down a TLS/SSL or QUIC connection
|
---|
6 |
|
---|
7 | =head1 SYNOPSIS
|
---|
8 |
|
---|
9 | #include <openssl/ssl.h>
|
---|
10 |
|
---|
11 | int SSL_shutdown(SSL *ssl);
|
---|
12 |
|
---|
13 | typedef struct ssl_shutdown_ex_args_st {
|
---|
14 | uint64_t quic_error_code;
|
---|
15 | const char *quic_reason;
|
---|
16 | } SSL_SHUTDOWN_EX_ARGS;
|
---|
17 |
|
---|
18 | __owur int SSL_shutdown_ex(SSL *ssl, uint64_t flags,
|
---|
19 | const SSL_SHUTDOWN_EX_ARGS *args,
|
---|
20 | size_t args_len);
|
---|
21 |
|
---|
22 | =head1 DESCRIPTION
|
---|
23 |
|
---|
24 | SSL_shutdown() shuts down an active connection represented by an SSL object.
|
---|
25 |
|
---|
26 | SSL_shutdown_ex() is an extended version of SSL_shutdown(). If non-NULL, I<args>
|
---|
27 | must point to a B<SSL_SHUTDOWN_EX_ARGS> structure and I<args_len> must be set to
|
---|
28 | C<sizeof(SSL_SHUTDOWN_EX_ARGS)>. The B<SSL_SHUTDOWN_EX_ARGS> structure must be
|
---|
29 | zero-initialized. If I<args> is NULL, the behaviour is the same as passing a
|
---|
30 | zero-initialised B<SSL_SHUTDOWN_EX_ARGS> structure. Currently, all extended
|
---|
31 | arguments relate to usage with QUIC, therefore this call functions identically
|
---|
32 | to SSL_shutdown() when not being used with QUIC.
|
---|
33 |
|
---|
34 | While the general operation of SSL_shutdown() is common between protocols, the
|
---|
35 | exact nature of how a shutdown is performed depends on the underlying protocol
|
---|
36 | being used. See the section below pertaining to each protocol for more
|
---|
37 | information.
|
---|
38 |
|
---|
39 | In general, calling SSL_shutdown() in nonblocking mode will initiate the
|
---|
40 | shutdown process and return 0 to indicate that the shutdown process has not yet
|
---|
41 | completed. Once the shutdown process has completed, subsequent calls to
|
---|
42 | SSL_shutdown() will return 1. See the RETURN VALUES section for more
|
---|
43 | information.
|
---|
44 |
|
---|
45 | SSL_shutdown() should not be called if a previous fatal error has occurred on a
|
---|
46 | connection; i.e., if L<SSL_get_error(3)> has returned B<SSL_ERROR_SYSCALL> or
|
---|
47 | B<SSL_ERROR_SSL>.
|
---|
48 |
|
---|
49 | =head1 TLS AND DTLS-SPECIFIC CONSIDERATIONS
|
---|
50 |
|
---|
51 | Shutdown for SSL/TLS and DTLS is implemented in terms of the SSL/TLS/DTLS
|
---|
52 | close_notify alert message. The shutdown process for SSL/TLS and DTLS
|
---|
53 | consists of two steps:
|
---|
54 |
|
---|
55 | =over 4
|
---|
56 |
|
---|
57 | =item *
|
---|
58 |
|
---|
59 | A close_notify shutdown alert message is sent to the peer.
|
---|
60 |
|
---|
61 | =item *
|
---|
62 |
|
---|
63 | A close_notify shutdown alert message is received from the peer.
|
---|
64 |
|
---|
65 | =back
|
---|
66 |
|
---|
67 | These steps can occur in either order depending on whether the connection
|
---|
68 | shutdown process was first initiated by the local application or by the peer.
|
---|
69 |
|
---|
70 | =head2 Locally-Initiated Shutdown
|
---|
71 |
|
---|
72 | Calling SSL_shutdown() on a SSL/TLS or DTLS SSL object initiates the shutdown
|
---|
73 | process and causes OpenSSL to try to send a close_notify shutdown alert to the
|
---|
74 | peer. The shutdown process will then be considered completed once the peer
|
---|
75 | responds in turn with a close_notify shutdown alert message.
|
---|
76 |
|
---|
77 | Calling SSL_shutdown() only closes the write direction of the connection; the
|
---|
78 | read direction is closed by the peer. Once SSL_shutdown() is called,
|
---|
79 | L<SSL_write(3)> can no longer be used, but L<SSL_read(3)> may still be used
|
---|
80 | until the peer decides to close the connection in turn. The peer might
|
---|
81 | continue sending data for some period of time before handling the local
|
---|
82 | application's shutdown indication.
|
---|
83 |
|
---|
84 | SSL_shutdown() does not affect an underlying network connection such as a TCP
|
---|
85 | connection, which remains open.
|
---|
86 |
|
---|
87 | =head2 Remotely-Initiated Shutdown
|
---|
88 |
|
---|
89 | If the peer was the first to initiate the shutdown process by sending a
|
---|
90 | close_notify alert message, an application will be notified of this as an EOF
|
---|
91 | condition when calling
|
---|
92 | L<SSL_read(3)> (i.e., L<SSL_read(3)> will fail and L<SSL_get_error(3)> will
|
---|
93 | return B<SSL_ERROR_ZERO_RETURN>), after all application data sent by the peer
|
---|
94 | prior to initiating the shutdown has been read. An application should handle
|
---|
95 | this condition by calling SSL_shutdown() to respond with a close_notify alert in
|
---|
96 | turn, completing the shutdown process, though it may choose to write additional
|
---|
97 | application data using L<SSL_write(3)> before doing so. If an application does
|
---|
98 | not call SSL_shutdown() in this case, a close_notify alert will not be sent and
|
---|
99 | the behaviour will not be fully standards compliant.
|
---|
100 |
|
---|
101 | =head2 Shutdown Lifecycle
|
---|
102 |
|
---|
103 | Regardless of whether a shutdown was initiated locally or by the peer, if the
|
---|
104 | underlying BIO is blocking, a call to SSL_shutdown() will return firstly once a
|
---|
105 | close_notify alert message is written to the peer (returning 0), and upon a
|
---|
106 | second and subsequent call, once a corresponding message is received from the
|
---|
107 | peer (returning 1 and completing the shutdown process). Calls to SSL_shutdown()
|
---|
108 | with a blocking underlying BIO will also return if an error occurs.
|
---|
109 |
|
---|
110 | If the underlying BIO is nonblocking and the shutdown process is not yet
|
---|
111 | complete (for example, because a close_notify alert message has not yet been
|
---|
112 | received from the peer, or because a close_notify alert message needs to be sent
|
---|
113 | but would currently block), SSL_shutdown() returns 0 to indicate that the
|
---|
114 | shutdown process is still ongoing; in this case, a call to L<SSL_get_error(3)>
|
---|
115 | will yield B<SSL_ERROR_WANT_READ> or B<SSL_ERROR_WANT_WRITE>.
|
---|
116 |
|
---|
117 | An application can then detect completion of the shutdown process by calling
|
---|
118 | SSL_shutdown() again repeatedly until it returns 1, indicating that the shutdown
|
---|
119 | process is complete (with a close_notify alert having both been sent and
|
---|
120 | received).
|
---|
121 |
|
---|
122 | However, the preferred method of waiting for the shutdown to complete is to use
|
---|
123 | L<SSL_read(3)> until L<SSL_get_error(3)> indicates EOF by returning
|
---|
124 | B<SSL_ERROR_ZERO_RETURN>. This ensures any data received immediately before the
|
---|
125 | peer's close_notify alert is still provided to the application. It also ensures
|
---|
126 | any final handshake-layer messages received are processed (for example, messages
|
---|
127 | issuing new session tickets).
|
---|
128 |
|
---|
129 | If this approach is not used, the second call to SSL_shutdown() (to complete the
|
---|
130 | shutdown by confirming receipt of the peer's close_notify message) will fail if
|
---|
131 | it is called when the application has not read all pending application data
|
---|
132 | sent by the peer using L<SSL_read(3)>.
|
---|
133 |
|
---|
134 | When calling SSL_shutdown(), the B<SSL_SENT_SHUTDOWN> flag is set once an
|
---|
135 | attempt is made to send a close_notify alert, regardless of whether the attempt
|
---|
136 | was successful. The B<SSL_RECEIVED_SHUTDOWN> flag is set once a close_notify
|
---|
137 | alert is received, which may occur during any call which processes incoming data
|
---|
138 | from the network, such as L<SSL_read(3)> or SSL_shutdown(). These flags
|
---|
139 | may be checked using L<SSL_get_shutdown(3)>.
|
---|
140 |
|
---|
141 | =head2 Fast Shutdown
|
---|
142 |
|
---|
143 | Alternatively, it is acceptable for an application to call SSL_shutdown() once
|
---|
144 | (such that it returns 0) and then close the underlying connection without
|
---|
145 | waiting for the peer's response. This allows for a more rapid shutdown process
|
---|
146 | if the application does not wish to wait for the peer.
|
---|
147 |
|
---|
148 | This alternative "fast shutdown" approach should only be done if it is known
|
---|
149 | that the peer will not send more data, otherwise there is a risk of an
|
---|
150 | application exposing itself to a truncation attack. The full SSL_shutdown()
|
---|
151 | process, in which both parties send close_notify alerts and SSL_shutdown()
|
---|
152 | returns 1, provides a cryptographically authenticated indication of the end of a
|
---|
153 | connection.
|
---|
154 |
|
---|
155 | This approach of a single SSL_shutdown() call without waiting is preferable to
|
---|
156 | simply calling L<SSL_free(3)> or L<SSL_clear(3)> as calling SSL_shutdown()
|
---|
157 | beforehand makes an SSL session eligible for subsequent reuse and notifies the
|
---|
158 | peer of connection shutdown.
|
---|
159 |
|
---|
160 | The fast shutdown approach can only be used if there is no intention to reuse
|
---|
161 | the underlying connection (e.g. a TCP connection) for further communication; in
|
---|
162 | this case, the full shutdown process must be performed to ensure
|
---|
163 | synchronisation.
|
---|
164 |
|
---|
165 | =head2 Effects on Session Reuse
|
---|
166 |
|
---|
167 | Calling SSL_shutdown() sets the SSL_SENT_SHUTDOWN flag (see
|
---|
168 | L<SSL_set_shutdown(3)>), regardless of whether the transmission of the
|
---|
169 | close_notify alert was successful or not. This makes the SSL session eligible
|
---|
170 | for reuse; the SSL session is considered properly closed and can be reused for
|
---|
171 | future connections.
|
---|
172 |
|
---|
173 | =head2 Quiet Shutdown
|
---|
174 |
|
---|
175 | SSL_shutdown() can be modified to set the connection to the "shutdown"
|
---|
176 | state without actually sending a close_notify alert message; see
|
---|
177 | L<SSL_CTX_set_quiet_shutdown(3)>. When "quiet shutdown" is enabled,
|
---|
178 | SSL_shutdown() will always succeed and return 1 immediately.
|
---|
179 |
|
---|
180 | This is not standards-compliant behaviour. It should only be done when the
|
---|
181 | application protocol in use enables the peer to ensure that all data has been
|
---|
182 | received, such that it doesn't need to wait for a close_notify alert, otherwise
|
---|
183 | application data may be truncated unexpectedly.
|
---|
184 |
|
---|
185 | =head2 Non-Compliant Peers
|
---|
186 |
|
---|
187 | There are SSL/TLS implementations that never send the required close_notify
|
---|
188 | alert message but simply close the underlying transport (e.g. a TCP connection)
|
---|
189 | instead. This will ordinarily result in an error being generated.
|
---|
190 |
|
---|
191 | If compatibility with such peers is desired, the option
|
---|
192 | B<SSL_OP_IGNORE_UNEXPECTED_EOF> can be set. For more information, see
|
---|
193 | L<SSL_CTX_set_options(3)>.
|
---|
194 |
|
---|
195 | Note that use of this option means that the EOF condition for application data
|
---|
196 | does not receive cryptographic protection, and therefore renders an application
|
---|
197 | potentially vulnerable to truncation attacks. Thus, this option must only be
|
---|
198 | used in conjunction with an application protocol which indicates unambiguously
|
---|
199 | when all data has been received.
|
---|
200 |
|
---|
201 | An alternative approach is to simply avoid calling L<SSL_read(3)> if it is known
|
---|
202 | that no more data is going to be sent. This requires an application protocol
|
---|
203 | which indicates unambiguously when all data has been sent.
|
---|
204 |
|
---|
205 | =head2 Session Ticket Handling
|
---|
206 |
|
---|
207 | If a client application only writes to a SSL/TLS or DTLS connection and never
|
---|
208 | reads, OpenSSL may never process new SSL/TLS session tickets sent by the server.
|
---|
209 | This is because OpenSSL ordinarily processes handshake messages received from a
|
---|
210 | peer during calls to L<SSL_read(3)> by the application.
|
---|
211 |
|
---|
212 | Therefore, client applications which only write and do not read but which wish
|
---|
213 | to benefit from session resumption are advised to perform a complete shutdown
|
---|
214 | procedure by calling SSL_shutdown() until it returns 1, as described above. This
|
---|
215 | will ensure there is an opportunity for SSL/TLS session ticket messages to be
|
---|
216 | received and processed by OpenSSL.
|
---|
217 |
|
---|
218 | =head1 QUIC-SPECIFIC SHUTDOWN CONSIDERATIONS
|
---|
219 |
|
---|
220 | When used with a QUIC connection SSL object, SSL_shutdown() initiates a QUIC
|
---|
221 | immediate close using QUIC B<CONNECTION_CLOSE> frames.
|
---|
222 |
|
---|
223 | SSL_shutdown() cannot be used on QUIC stream SSL objects. To conclude a stream
|
---|
224 | normally, see L<SSL_stream_conclude(3)>; to perform a non-normal stream
|
---|
225 | termination, see L<SSL_stream_reset(3)>.
|
---|
226 |
|
---|
227 | SSL_shutdown_ex() may be used instead of SSL_shutdown() by an application to
|
---|
228 | provide additional information to the peer on the reason why a connection is
|
---|
229 | being shut down. The information which can be provided is as follows:
|
---|
230 |
|
---|
231 | =over 4
|
---|
232 |
|
---|
233 | =item I<quic_error_code>
|
---|
234 |
|
---|
235 | An optional 62-bit application error code to be signalled to the peer. The value
|
---|
236 | must be in the range [0, 2**62-1], else the call to SSL_shutdown_ex() fails. If
|
---|
237 | not provided, an error code of 0 is used by default.
|
---|
238 |
|
---|
239 | =item I<quic_reason>
|
---|
240 |
|
---|
241 | An optional zero-terminated (UTF-8) reason string to be signalled to the peer.
|
---|
242 | The application is responsible for providing a valid UTF-8 string and OpenSSL
|
---|
243 | will not validate the string. If a reason is not provided, or SSL_shutdown() is
|
---|
244 | used, a zero-length string is used as the reason. If provided, the reason string
|
---|
245 | is copied and stored inside the QUIC connection SSL object and need not remain
|
---|
246 | allocated after the call to SSL_shutdown_ex() returns. Reason strings are
|
---|
247 | bounded by the path MTU and may be silently truncated if they are too long to
|
---|
248 | fit in a QUIC packet.
|
---|
249 |
|
---|
250 | Reason strings are intended for human diagnostic purposes only, and should not
|
---|
251 | be used for application signalling.
|
---|
252 |
|
---|
253 | =back
|
---|
254 |
|
---|
255 | The arguments to SSL_shutdown_ex() are used only on the first call to
|
---|
256 | SSL_shutdown_ex() (or SSL_shutdown()) for a given QUIC connection SSL object.
|
---|
257 | These arguments are ignored on subsequent calls.
|
---|
258 |
|
---|
259 | These functions do not affect an underlying network BIO or the resource it
|
---|
260 | represents; for example, a UDP datagram provided to a QUIC connection as the
|
---|
261 | network BIO will remain open.
|
---|
262 |
|
---|
263 | Note that when using QUIC, an application must call SSL_shutdown() if it wants
|
---|
264 | to ensure that all transmitted data was received by the peer. This is unlike a
|
---|
265 | TLS/TCP connection, where reliable transmission of buffered data is the
|
---|
266 | responsibility of the operating system. If an application calls SSL_free() on a
|
---|
267 | QUIC connection SSL object or exits before completing the shutdown process using
|
---|
268 | SSL_shutdown(), data which was written by the application using SSL_write(), but
|
---|
269 | could not yet be transmitted, or which was sent but lost in the network, may not
|
---|
270 | be received by the peer.
|
---|
271 |
|
---|
272 | When using QUIC, calling SSL_shutdown() allows internal network event processing
|
---|
273 | to be performed. It is important that this processing is performed regularly,
|
---|
274 | whether during connection usage or during shutdown. If an application is not
|
---|
275 | using thread assisted mode, an application conducting shutdown should either
|
---|
276 | ensure that SSL_shutdown() is called regularly, or alternatively ensure that
|
---|
277 | SSL_handle_events() is called regularly. See L<openssl-quic(7)> and
|
---|
278 | L<SSL_handle_events(3)> for more information.
|
---|
279 |
|
---|
280 | =head2 Application Data Drainage Behaviour
|
---|
281 |
|
---|
282 | When using QUIC, SSL_shutdown() or SSL_shutdown_ex() ordinarily waits until all
|
---|
283 | data written to a stream by an application has been acknowledged by the peer. In
|
---|
284 | other words, the shutdown process waits until all data written by the
|
---|
285 | application has been sent to the peer, and until the receipt of all such data is
|
---|
286 | acknowledged by the peer. Only once this process is completed is the shutdown
|
---|
287 | considered complete.
|
---|
288 |
|
---|
289 | An exception to this is streams which terminated in a non-normal fashion, for
|
---|
290 | example due to a stream reset; only streams which are non-terminated at the time
|
---|
291 | SSL_shutdown() is called, or which terminated in a normal fashion, have their
|
---|
292 | pending send buffers flushed in this manner.
|
---|
293 |
|
---|
294 | This behaviour of flushing streams during the shutdown process can be skipped by
|
---|
295 | setting the B<SSL_SHUTDOWN_FLAG_NO_STREAM_FLUSH> flag in a call to
|
---|
296 | SSL_shutdown_ex(); in this case, data remaining in stream send buffers may not
|
---|
297 | be transmitted to the peer. This flag may be used when a non-normal application
|
---|
298 | condition has occurred and the delivery of data written to streams via
|
---|
299 | L<SSL_write(3)> is no longer relevant.
|
---|
300 |
|
---|
301 | =head2 Shutdown Mode
|
---|
302 |
|
---|
303 | Aspects of how QUIC handles connection closure must be taken into account by
|
---|
304 | applications. Ordinarily, QUIC expects a connection to continue to be serviced
|
---|
305 | for a substantial period of time after it is nominally closed. This is necessary
|
---|
306 | to ensure that any connection closure notification sent to the peer was
|
---|
307 | successfully received. However, a consequence of this is that a fully
|
---|
308 | RFC-compliant QUIC connection closure process could take of the order of
|
---|
309 | seconds. This may be unsuitable for some applications, such as short-lived
|
---|
310 | processes which need to exit immediately after completing an application-layer
|
---|
311 | transaction.
|
---|
312 |
|
---|
313 | As such, there are two shutdown modes available to users of QUIC connection SSL
|
---|
314 | objects:
|
---|
315 |
|
---|
316 | =over 4
|
---|
317 |
|
---|
318 | =item RFC compliant shutdown mode
|
---|
319 |
|
---|
320 | This is the default behaviour. The shutdown process may take a period of time up
|
---|
321 | to three times the current estimated RTT to the peer. It is possible for the
|
---|
322 | closure process to complete much faster in some circumstances but this cannot be
|
---|
323 | relied upon.
|
---|
324 |
|
---|
325 | In blocking mode, the function will return once the closure process is complete.
|
---|
326 | In nonblocking mode, SSL_shutdown_ex() should be called until it returns 1,
|
---|
327 | indicating the closure process is complete and the connection is now fully shut
|
---|
328 | down.
|
---|
329 |
|
---|
330 | =item Rapid shutdown mode
|
---|
331 |
|
---|
332 | In this mode, the peer is notified of connection closure on a best effort basis
|
---|
333 | by sending a single QUIC packet. If that QUIC packet is lost, the peer will not
|
---|
334 | know that the connection has terminated until the negotiated idle timeout (if
|
---|
335 | any) expires.
|
---|
336 |
|
---|
337 | This will generally return 0 on success, indicating that the connection has not
|
---|
338 | yet been fully shut down (unless it has already done so, in which case it will
|
---|
339 | return 1).
|
---|
340 |
|
---|
341 | =back
|
---|
342 |
|
---|
343 | If B<SSL_SHUTDOWN_FLAG_RAPID> is specified in I<flags>, a rapid shutdown is
|
---|
344 | performed, otherwise an RFC-compliant shutdown is performed.
|
---|
345 |
|
---|
346 | If an application calls SSL_shutdown_ex() with B<SSL_SHUTDOWN_FLAG_RAPID>, an
|
---|
347 | application can subsequently change its mind about performing a rapid shutdown
|
---|
348 | by making a subsequent call to SSL_shutdown_ex() without the flag set.
|
---|
349 |
|
---|
350 | =head2 Peer-Initiated Shutdown
|
---|
351 |
|
---|
352 | In some cases, an application may wish to wait for a shutdown initiated by the
|
---|
353 | peer rather than triggered locally. To do this, call SSL_shutdown_ex() with
|
---|
354 | I<SSL_SHUTDOWN_FLAG_WAIT_PEER> specified in I<flags>. In blocking mode, this
|
---|
355 | waits until the peer initiates a shutdown or the connection otherwise becomes
|
---|
356 | terminated for another reason. In nonblocking mode it exits immediately with
|
---|
357 | either success or failure depending on whether a shutdown has occurred.
|
---|
358 |
|
---|
359 | If a locally initiated shutdown has already been triggered or the connection has
|
---|
360 | started terminating for another reason, this flag has no effect.
|
---|
361 |
|
---|
362 | B<SSL_SHUTDOWN_FLAG_WAIT_PEER> implies B<SSL_SHUTDOWN_FLAG_NO_STREAM_FLUSH>, as
|
---|
363 | stream data cannot be flushed after a peer closes the connection. Stream data
|
---|
364 | may still be sent to the peer in any time spent waiting before the peer closes
|
---|
365 | the connection, though there is no guarantee of this.
|
---|
366 |
|
---|
367 | =head2 Nonblocking Mode
|
---|
368 |
|
---|
369 | SSL_shutdown() and SSL_shutdown_ex() block if the connection is configured in
|
---|
370 | blocking mode. This may be overridden by specifying
|
---|
371 | B<SSL_SHUTDOWN_FLAG_NO_BLOCK> in I<flags> when calling SSL_shutdown_ex(), which
|
---|
372 | causes the call to operate as though in nonblocking mode.
|
---|
373 |
|
---|
374 | =head1 RETURN VALUES
|
---|
375 |
|
---|
376 | For both SSL_shutdown() and SSL_shutdown_ex() the following return values can occur:
|
---|
377 |
|
---|
378 | =over 4
|
---|
379 |
|
---|
380 | =item Z<>0
|
---|
381 |
|
---|
382 | The shutdown process is ongoing and has not yet completed.
|
---|
383 |
|
---|
384 | For TLS and DTLS, this means that a close_notify alert has been sent but the
|
---|
385 | peer has not yet replied in turn with its own close_notify.
|
---|
386 |
|
---|
387 | For QUIC connection SSL objects, a CONNECTION_CLOSE frame may have been
|
---|
388 | sent but the connection closure process has not yet completed.
|
---|
389 |
|
---|
390 | Unlike most other functions, returning 0 does not indicate an error.
|
---|
391 | L<SSL_get_error(3)> should not be called; it may misleadingly indicate an error
|
---|
392 | even though no error occurred.
|
---|
393 |
|
---|
394 | =item Z<>1
|
---|
395 |
|
---|
396 | The shutdown was successfully completed.
|
---|
397 |
|
---|
398 | For TLS and DTLS, this means that a close_notify alert was sent and the peer's
|
---|
399 | close_notify alert was received.
|
---|
400 |
|
---|
401 | For QUIC connection SSL objects, this means that the connection closure process
|
---|
402 | has completed.
|
---|
403 |
|
---|
404 | =item E<lt>0
|
---|
405 |
|
---|
406 | The shutdown was not successful.
|
---|
407 | Call L<SSL_get_error(3)> with the return value B<ret> to find out the reason.
|
---|
408 | It can occur if an action is needed to continue the operation for nonblocking
|
---|
409 | BIOs.
|
---|
410 |
|
---|
411 | It can also occur when not all data was read using SSL_read(), or if called
|
---|
412 | on a QUIC stream SSL object.
|
---|
413 |
|
---|
414 | This value is also returned when called on QUIC stream SSL objects.
|
---|
415 |
|
---|
416 | =back
|
---|
417 |
|
---|
418 | =head1 SEE ALSO
|
---|
419 |
|
---|
420 | L<SSL_get_error(3)>, L<SSL_connect(3)>,
|
---|
421 | L<SSL_accept(3)>, L<SSL_set_shutdown(3)>,
|
---|
422 | L<SSL_CTX_set_quiet_shutdown(3)>, L<SSL_CTX_set_options(3)>
|
---|
423 | L<SSL_clear(3)>, L<SSL_free(3)>,
|
---|
424 | L<ssl(7)>, L<bio(7)>
|
---|
425 |
|
---|
426 | =head1 HISTORY
|
---|
427 |
|
---|
428 | The SSL_shutdown_ex() function was added in OpenSSL 3.2.
|
---|
429 |
|
---|
430 | =head1 COPYRIGHT
|
---|
431 |
|
---|
432 | Copyright 2000-2023 The OpenSSL Project Authors. All Rights Reserved.
|
---|
433 |
|
---|
434 | Licensed under the Apache License 2.0 (the "License"). You may not use
|
---|
435 | this file except in compliance with the License. You can obtain a copy
|
---|
436 | in the file LICENSE in the source distribution or at
|
---|
437 | L<https://www.openssl.org/source/license.html>.
|
---|
438 |
|
---|
439 | =cut
|
---|