summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* MIME: added image/avif type.Maxim Dounin2021-10-251-0/+1
| | | | Prodded by Ryo Hirafuji, André Rømcke, Artur Juraszek.
* SSL: SSL_sendfile() support with kernel TLS.Maxim Dounin2021-10-214-9/+211
| | | | | | | | | | | | | | | | Requires OpenSSL 3.0 compiled with "enable-ktls" option. Further, KTLS needs to be enabled in kernel, and in OpenSSL, either via OpenSSL configuration file or with "ssl_conf_command Options KTLS;" in nginx configuration. On FreeBSD, kernel TLS is available starting with FreeBSD 13.0, and can be enabled with "sysctl kern.ipc.tls.enable=1" and "kldload ktls_ocf" to load a software backend, see man ktls(4) for details. On Linux, kernel TLS is available starting with kernel 4.13 (at least 5.2 is recommended), and needs kernel compiled with CONFIG_TLS=y (with CONFIG_TLS=m, which is used at least on Ubuntu 21.04 by default, the tls module needs to be loaded with "modprobe tls").
* Style: added missing "static" specifiers.Maxim Dounin2021-10-212-4/+5
| | | | | Mostly found by gcc -Wtraditional, per "non-static declaration of ... follows static declaration [-Wtraditional]" warnings.
* Removed CLOCK_MONOTONIC_COARSE support.Maxim Dounin2021-10-211-4/+0
| | | | | | | | | | While clock_gettime(CLOCK_MONOTONIC_COARSE) is faster than clock_gettime(CLOCK_MONOTONIC), the latter is fast enough on Linux for practical usage, and the difference is negligible compared to other costs at each event loop iteration. On the other hand, CLOCK_MONOTONIC_COARSE causes various issues with typical CONFIG_HZ=250, notably very inaccurate limit_rate handling in some edge cases (ticket #1678) and negative difference between $request_time and $upstream_response_time (ticket #1965).
* Mail: connections with wrong ALPN protocols are now rejected.Vladimir Homutov2021-10-205-0/+62
| | | | | | | | | | | This is a recommended behavior by RFC 7301 and is useful for mitigation of protocol confusion attacks [1]. For POP3 and IMAP protocols IANA-assigned ALPN IDs are used [2]. For the SMTP protocol "smtp" is used. [1] https://alpaca-attack.com/ [2] https://www.iana.org/assignments/tls-extensiontype-values/
* HTTP: connections with wrong ALPN protocols are now rejected.Vladimir Homutov2021-10-201-7/+6
| | | | | | | | | | | | This is a recommended behavior by RFC 7301 and is useful for mitigation of protocol confusion attacks [1]. To avoid possible negative effects, list of supported protocols was extended to include all possible HTTP protocol ALPN IDs registered by IANA [2], i.e. "http/1.0" and "http/0.9". [1] https://alpaca-attack.com/ [2] https://www.iana.org/assignments/tls-extensiontype-values/
* Stream: the "ssl_alpn" directive.Vladimir Homutov2021-10-193-0/+121
| | | | | | The directive sets the server list of supported application protocols and requires one of this protocols to be negotiated if client is using ALPN.
* SSL: added $ssl_alpn_protocol variable.Vladimir Homutov2021-10-144-0/+38
| | | | | The variable contains protocol selected by ALPN during handshake and is empty otherwise.
* HTTP/2: removed support for NPN.Vladimir Homutov2021-10-154-72/+9
| | | | | | | | | | | | | | NPN was replaced with ALPN, published as RFC 7301 in July 2014. It used to negotiate SPDY (and, in transition, HTTP/2). NPN supported appeared in OpenSSL 1.0.1. It does not work with TLSv1.3 [1]. ALPN is supported since OpenSSL 1.0.2. The NPN support was dropped in Firefox 53 [2] and Chrome 51 [3]. [1] https://github.com/openssl/openssl/issues/3665. [2] https://bugzilla.mozilla.org/show_bug.cgi?id=1248198 [3] https://www.chromestatus.com/feature/5767920709795840
* Upstream: fixed logging level of upstream invalid header errors.Maxim Dounin2021-10-184-4/+4
| | | | | | | In b87b7092cedb (nginx 1.21.1), logging level of "upstream sent invalid header" errors was accidentally changed to "info". This change restores the "error" level, which is a proper logging level for upstream-side errors.
* Synced ngx_http_subrequest() argument names (ticket #2255).Maxim Dounin2021-10-121-2/+2
|
* Proxy: disabled keepalive on extra data in non-buffered mode.Awdhesh Mathpal2021-10-071-0/+1
| | | | | | | The u->keepalive flag is initialized early if the response has no body (or an empty body), and needs to be reset if there are any extra data, similarly to how it is done in ngx_http_proxy_copy_filter(). Missed in 83c4622053b0.
* Fixed $content_length cacheability with chunked (ticket #2252).Maxim Dounin2021-10-061-0/+4
|
* Stream: added half-close support.Vladimir Homutov2021-09-222-0/+37
| | | | | | The "proxy_half_close" directive enables handling of TCP half close. If enabled, connection to proxied server is kept open until both read ends get EOF. Write end shutdown is properly transmitted via proxy.
* Request body: do not create temp file if there's nothing to write.Roman Arutyunyan2021-09-101-1/+1
| | | | | | | | | Do this only when the entire request body is empty and r->request_body_in_file_only is set. The issue manifested itself with missing warning "a client request body is buffered to a temporary file" when the entire rb->buf is full and all buffers are delayed by a filter.
* Version bump.Roman Arutyunyan2021-09-141-2/+2
|
* release-1.21.3 tagMaxim Dounin2021-09-071-0/+1
|
* nginx-1.21.3-RELEASErelease-1.21.3Maxim Dounin2021-09-071-0/+27
|
* HTTP/2: optimized processing of small DATA frames.Maxim Dounin2021-09-061-54/+12
| | | | | | | | | | | | | The request body filter chain is no longer called after processing a DATA frame. Instead, we now post a read event to do this. This ensures that multiple small DATA frames read during the same event loop iteration are coalesced together, resulting in much faster processing. Since rb->buf can now contain unprocessed data, window update is no longer sent in ngx_http_v2_state_read_data() in case of flow control being used due to filter buffering. Instead, window will be updated by ngx_http_v2_read_client_request_body_handler() in the posted read event.
* HTTP/2: fixed timers left after request body reading.Maxim Dounin2021-09-061-12/+12
| | | | | | | | | | | | | Following rb->filter_need_buffering changes, request body reading is only finished after the filter chain is called and rb->last_saved is set. As such, with r->request_body_no_buffering, timer on fc->read is no longer removed when the last part of the body is received, potentially resulting in incorrect behaviour. The fix is to call ngx_http_v2_process_request_body() from the ngx_http_v2_read_unbuffered_request_body() function instead of directly calling ngx_http_v2_filter_request_body(), so the timer is properly removed.
* HTTP/2: fixed window updates when buffering in filters.Maxim Dounin2021-09-061-2/+18
| | | | | | | | | | | | | In the body read handler, the window was incorrectly calculated based on the full buffer size instead of the amount of free space in the buffer. If the request body is buffered by a filter, and the buffer is not empty after the read event is generated by the filter to resume request body processing, this could result in "http2 negative window update" alerts. Further, in the body ready handler and in ngx_http_v2_state_read_data() the buffer wasn't cleared when the data were already written to disk, so the client might stuck without window updates.
* Fixed debug logging.Roman Arutyunyan2021-09-021-2/+2
|
* Version bump.Roman Arutyunyan2021-09-031-2/+2
|
* release-1.21.2 tagMaxim Dounin2021-08-311-0/+1
|
* nginx-1.21.2-RELEASErelease-1.21.2Maxim Dounin2021-08-311-0/+107
|
* Updated OpenSSL used for win32 builds.Maxim Dounin2021-08-311-1/+1
|
* HTTP/2: avoid memcpy() with NULL source and zero length.Maxim Dounin2021-08-311-1/+3
| | | | Prodded by Clang Static Analyzer.
* Give GCC atomics precedence over deprecated Darwin atomic(3).Sergey Kandaurov2021-08-301-33/+33
| | | | This allows to build nginx on macOS with -Wdeprecated-declarations.
* Request body: reading body buffering in filters.Maxim Dounin2021-08-293-26/+182
| | | | | | | | | | | | | If a filter wants to buffer the request body during reading (for example, to check an external scanner), it can now do so. To make it possible, the code now checks rb->last_saved (introduced in the previous change) along with rb->rest == 0. Since in HTTP/2 this requires flow control to avoid overflowing the request body buffer, so filters which need buffering have to set the rb->filter_need_buffering flag on the first filter call. (Note that each filter is expected to call the next filter, so all filters will be able set the flag if needed.)
* Request body: introduced rb->last_saved flag.Maxim Dounin2021-08-292-15/+54
| | | | | | It indicates that the last buffer was received by the save filter, and can be used to check this at higher levels. To be used in the following changes.
* Request body: added alert to catch duplicate body saving.Maxim Dounin2021-08-291-0/+6
| | | | | | If due to an error ngx_http_request_body_save_filter() is called more than once with rb->rest == 0, this used to result in a segmentation fault. Added an alert to catch such errors, just in case.
* Request body: missing comments about initialization.Maxim Dounin2021-08-291-0/+2
|
* HTTP/2: improved handling of preread unbuffered requests.Maxim Dounin2021-08-291-1/+1
| | | | | | Previously, fully preread unbuffered requests larger than client body buffer size were saved to disk, despite the fact that "unbuffered" is expected to imply no disk buffering.
* HTTP/2: improved handling of END_STREAM in a separate DATA frame.Maxim Dounin2021-08-291-0/+3
| | | | | | | | | | | | The save body filter saves the request body to disk once the buffer is full. Yet in HTTP/2 this might happen even if there is no need to save anything to disk, notably when content length is known and the END_STREAM flag is sent in a separate empty DATA frame. Workaround is to provide additional byte in the buffer, so saving the request body won't be triggered. This fixes unexpected request body disk buffering in HTTP/2 observed after the previous change when content length is known and the END_STREAM flag is sent in a separate empty DATA frame.
* HTTP/2: reworked body reading to better match HTTP/1.x code.Maxim Dounin2021-08-291-62/+96
| | | | | | | | | In particular, now the code always uses a buffer limited by client_body_buffer_size. At the cost of an additional copy it ensures that small DATA frames are not directly mapped to small write() syscalls, but rather buffered in memory before writing. Further, requests without Content-Length are no longer forced to use temporary files.
* HTTP/2: improved body reading logging.Maxim Dounin2021-08-291-0/+6
|
* Upstream: fixed timeouts with gRPC, SSL and select (ticket #2229).Maxim Dounin2021-08-201-0/+4
| | | | | | | | | | | | | | | | | With SSL it is possible that an established connection is ready for reading after the handshake. Further, events might be already disabled in case of level-triggered event methods. If this happens and ngx_http_upstream_send_request() blocks waiting for some data from the upstream, such as flow control in case of gRPC, the connection will time out due to no read events on the upstream connection. Fix is to explicitly check the c->read->ready flag if sending request blocks and post a read event if it is set. Note that while it is possible to modify ngx_ssl_handshake() to keep read events active, this won't completely resolve the issue, since there can be data already received during the SSL handshake (see 573bd30e46b4).
* Mail: Auth-SSL-Protocol and Auth-SSL-Cipher headers (ticket #2134).Rob Mueller2021-08-131-2/+39
| | | | | | | | | | | | This adds new Auth-SSL-Protocol and Auth-SSL-Cipher headers to the mail proxy auth protocol when SSL is enabled. This can be useful for detecting users using older clients that negotiate old ciphers when you want to upgrade to newer TLS versions of remove suppport for old and insecure ciphers. You can use your auth backend to notify these users before the upgrade that they either need to upgrade their client software or contact your support team to work out an upgrade path.
* SSL: ciphers now set before loading certificates (ticket #2035).Maxim Dounin2021-08-167-43/+43
| | | | | | | To load old/weak server or client certificates it might be needed to adjust the security level, as introduced in OpenSSL 1.1.0. This change ensures that ciphers are set before loading the certificates, so security level changes via the cipher string apply to certificate loading.
* Dark mode support in welcome and 50x error pages.Maxim Dounin2021-08-162-0/+2
| | | | Prodded by Duncan Lock.
* Welcome and 50x error pages style.Maxim Dounin2021-08-162-10/+4
| | | | Indentation of the CSS code removed to match style of the HTML code.
* SSL: removed use of the SSL_OP_MSIE_SSLV2_RSA_PADDING option.Sergey Kandaurov2021-08-101-5/+0
| | | | It has no effect since OpenSSL 0.9.7h and 0.9.8a.
* SSL: removed export ciphers support.Sergey Kandaurov2021-08-102-36/+0
| | | | | | Export ciphers are forbidden to negotiate in TLS 1.1 and later protocol modes. They are disabled since OpenSSL 1.0.2g by default unless explicitly configured with "enable-weak-ssl-ciphers", and completely removed in OpenSSL 1.1.0.
* SSL: use of the SSL_OP_IGNORE_UNEXPECTED_EOF option.Sergey Kandaurov2021-08-101-0/+4
| | | | | | | | | | | | | | | | | A new behaviour was introduced in OpenSSL 1.1.1e, when a peer does not send close_notify before closing the connection. Previously, it was to return SSL_ERROR_SYSCALL with errno 0, known since at least OpenSSL 0.9.7, and is handled gracefully in nginx. Now it returns SSL_ERROR_SSL with a distinct reason SSL_R_UNEXPECTED_EOF_WHILE_READING ("unexpected eof while reading"). This leads to critical errors seen in nginx within various routines such as SSL_do_handshake(), SSL_read(), SSL_shutdown(). The behaviour was restored in OpenSSL 1.1.1f, but presents in OpenSSL 3.0 by default. Use of the SSL_OP_IGNORE_UNEXPECTED_EOF option added in OpenSSL 3.0 allows to set a compatible behaviour to return SSL_ERROR_ZERO_RETURN: https://git.openssl.org/?p=openssl.git;a=commitdiff;h=09b90e0 See for additional details: https://github.com/openssl/openssl/issues/11381
* SSL: silenced warnings when building with OpenSSL 3.0.Sergey Kandaurov2021-08-101-0/+2
| | | | | | | | | The OPENSSL_SUPPRESS_DEPRECATED macro is used to suppress deprecation warnings. This covers Session Tickets keys, SSL Engine, DH low level API for DHE ciphers. Unlike OPENSSL_API_COMPAT, it works well with OpenSSL built with no-deprecated. In particular, it doesn't unhide various macros in OpenSSL includes, which are meant to be hidden under OPENSSL_NO_DEPRECATED.
* SSL: ERR_peek_error_line_data() compatibility with OpenSSL 3.0.Sergey Kandaurov2021-08-102-1/+6
| | | | | ERR_peek_error_line_data() was deprecated in favour of ERR_peek_error_all(). Here we use the ERR_peek_error_data() helper to pass only used arguments.
* SSL: using SSL_CTX_set0_tmp_dh_pkey() with OpenSSL 3.0 in dhparam.Sergey Kandaurov2021-08-101-1/+31
| | | | | | Using PEM_read_bio_DHparams() and SSL_CTX_set_tmp_dh() is deprecated as part of deprecating the low level DH functions in favor of EVP_PKEY: https://git.openssl.org/?p=openssl.git;a=commitdiff;h=163f6dc
* SSL: SSL_get_peer_certificate() is deprecated in OpenSSL 3.0.Sergey Kandaurov2021-08-101-0/+5
| | | | | Switch to SSL_get1_peer_certificate() when building with OpenSSL 3.0 and OPENSSL_NO_DEPRECATED defined.
* SSL: RSA data type is deprecated in OpenSSL 3.0.Sergey Kandaurov2021-08-102-1/+7
| | | | | The only consumer is a callback function for SSL_CTX_set_tmp_rsa_callback() deprecated in OpenSSL 1.1.0. Now the function is conditionally compiled too.
* Disabled HTTP/1.0 requests with Transfer-Encoding.Sergey Kandaurov2021-08-091-0/+8
| | | | | | | | | | The latest HTTP/1.1 draft describes Transfer-Encoding in HTTP/1.0 as having potentially faulty message framing as that could have been forwarded without handling of the chunked encoding, and forbids processing subsequest requests over that connection: https://github.com/httpwg/http-core/issues/879. While handling of such requests is permitted, the most secure approach seems to reject them.