Welcome! Log In Create A New Profile

Advanced

Re: [PATCH] QUIC: OpenSSL compatibility layer

Sergey Kandaurov
March 23, 2023 09:20AM
On Wed, Feb 08, 2023 at 06:41:38PM +0400, Roman Arutyunyan wrote:
> # HG changeset patch
> # User Roman Arutyunyan <arut@nginx.com>
> # Date 1675867049 -14400
> # Wed Feb 08 18:37:29 2023 +0400
> # Branch quic
> # Node ID a3142c8833f5bf1186599e7938141f5062fac4a2
> # Parent 3c33d39a51d334d99fcc7d2b45e8d8190c431492
> QUIC: OpenSSL compatibility layer.
>
> The change allows to compile QUIC with OpenSSL which lacks BoringSSL QUIC API.
>
> This implementation does not support 0-RTT.

[..]

> diff --git a/src/http/modules/ngx_http_ssl_module.c b/src/http/modules/ngx_http_ssl_module.c
> --- a/src/http/modules/ngx_http_ssl_module.c
> +++ b/src/http/modules/ngx_http_ssl_module.c
> @@ -9,6 +9,10 @@
> #include <ngx_core.h>
> #include <ngx_http.h>
>
> +#if (NGX_QUIC_OPENSSL_COMPAT)
> +#include <ngx_event_quic_openssl_compat.h>
> +#endif
> +
>
> typedef ngx_int_t (*ngx_ssl_variable_handler_pt)(ngx_connection_t *c,
> ngx_pool_t *pool, ngx_str_t *s);
> @@ -1317,16 +1321,22 @@ ngx_http_ssl_init(ngx_conf_t *cf)
> continue;
> }
>
> + cscf = addr[a].default_server;
> + sscf = cscf->ctx->srv_conf[ngx_http_ssl_module.ctx_index];
> +
> if (addr[a].opt.http3) {
> name = "http3";
>
> +#if (NGX_QUIC_OPENSSL_COMPAT)
> + if (ngx_quic_compat_init(cf, sscf->ssl.ctx) != NGX_OK) {
> + return NGX_ERROR;
> + }
> +#endif
> +
> } else {
> name = "ssl";
> }
>
> - cscf = addr[a].default_server;
> - sscf = cscf->ctx->srv_conf[ngx_http_ssl_module.ctx_index];
> -
> if (sscf->certificates) {
>
> if (addr[a].opt.http3 && !(sscf->protocols & NGX_SSL_TLSv1_3)) {
> diff --git a/src/stream/ngx_stream_ssl_module.c b/src/stream/ngx_stream_ssl_module.c
> --- a/src/stream/ngx_stream_ssl_module.c
> +++ b/src/stream/ngx_stream_ssl_module.c
> @@ -9,6 +9,10 @@
> #include <ngx_core.h>
> #include <ngx_stream.h>
>
> +#if (NGX_QUIC_OPENSSL_COMPAT)
> +#include <ngx_event_quic_openssl_compat.h>
> +#endif
> +
>
> typedef ngx_int_t (*ngx_ssl_variable_handler_pt)(ngx_connection_t *c,
> ngx_pool_t *pool, ngx_str_t *s);
> @@ -1218,6 +1222,12 @@ ngx_stream_ssl_init(ngx_conf_t *cf)
>
> scf = listen[i].ctx->srv_conf[ngx_stream_ssl_module.ctx_index];
>
> +#if (NGX_QUIC_OPENSSL_COMPAT)
> + if (ngx_quic_compat_init(cf, scf->ssl.ctx) != NGX_OK) {
> + return NGX_ERROR;
> + }
> +#endif
> +
> if (scf->certificates && !(scf->protocols & NGX_SSL_TLSv1_3)) {
> ngx_log_error(NGX_LOG_EMERG, cf->log, 0,
> "\"ssl_protocols\" must enable TLSv1.3 for "

Following internal discussion with Roman, below is a fix for compat
layer initialization. This is a fallout after moving initialization
from ngx_ssl_create(). Although that change was justified, it has
left a couple of issues:
- SSL context can be NULL (normally caught later in function)
- only the default server was initialized, breaks with SNI.
The latter was caught by h3_ssl_reject_handshake.t

The fix is to initialize all servers that have SSL context.
The postconfiguration function is quite large, so this is moved
to the separate function. While here, moved back assignments
closer to the place of their use.

# HG changeset patch
# User Sergey Kandaurov <pluknet@nginx.com>
# Date 1679577205 -14400
# Thu Mar 23 17:13:25 2023 +0400
# Branch quic
# Node ID dcef88bdea77cf84b97580f21fbe05cc05ab631d
# Parent f4279edda9fdbbd836a86926d86cdc727492e94c
HTTP/3: fixed OpenSSL compatibility layer initialization.

SSL context is not present if the default server has neither certificates nor
ssl_reject_handshake enabled. Previously, this led to null pointer dereference
before it would be caught with configuration checks.

Additionally, virtual servers with distinct SSL contexts need to initialize
compatibility layer in order to complete a QUIC handshake.

diff --git a/src/http/modules/ngx_http_ssl_module.c b/src/http/modules/ngx_http_ssl_module.c
--- a/src/http/modules/ngx_http_ssl_module.c
+++ b/src/http/modules/ngx_http_ssl_module.c
@@ -56,6 +56,10 @@ static char *ngx_http_ssl_conf_command_c
void *data);

static ngx_int_t ngx_http_ssl_init(ngx_conf_t *cf);
+#if (NGX_QUIC_OPENSSL_COMPAT)
+static ngx_int_t ngx_http_ssl_quic_compat_init(ngx_conf_t *cf,
+ ngx_http_conf_addr_t *addr);
+#endif


static ngx_conf_bitmask_t ngx_http_ssl_protocols[] = {
@@ -1328,14 +1332,11 @@ ngx_http_ssl_init(ngx_conf_t *cf)
continue;
}

- cscf = addr[a].default_server;
- sscf = cscf->ctx->srv_conf[ngx_http_ssl_module.ctx_index];
-
if (addr[a].opt.quic) {
name = "quic";

#if (NGX_QUIC_OPENSSL_COMPAT)
- if (ngx_quic_compat_init(cf, sscf->ssl.ctx) != NGX_OK) {
+ if (ngx_http_ssl_quic_compat_init(cf, &addr[a]) != NGX_OK) {
return NGX_ERROR;
}
#endif
@@ -1344,6 +1345,9 @@ ngx_http_ssl_init(ngx_conf_t *cf)
name = "ssl";
}

+ cscf = addr[a].default_server;
+ sscf = cscf->ctx->srv_conf[ngx_http_ssl_module.ctx_index];
+
if (sscf->certificates) {

if (addr[a].opt.quic && !(sscf->protocols & NGX_SSL_TLSv1_3)) {
@@ -1391,3 +1395,27 @@ ngx_http_ssl_init(ngx_conf_t *cf)

return NGX_OK;
}
+
+
+static ngx_int_t
+ngx_http_ssl_quic_compat_init(ngx_conf_t *cf, ngx_http_conf_addr_t *addr)
+{
+ ngx_uint_t s;
+ ngx_http_ssl_srv_conf_t *sscf;
+ ngx_http_core_srv_conf_t **cscfp, *cscf;
+
+ cscfp = addr->servers.elts;
+ for (s = 0; s < addr->servers.nelts; s++) {
+
+ cscf = cscfp[s];
+ sscf = cscf->ctx->srv_conf[ngx_http_ssl_module.ctx_index];
+
+ if (sscf->certificates || sscf->reject_handshake) {
+ if (ngx_quic_compat_init(cf, sscf->ssl.ctx) != NGX_OK) {
+ return NGX_ERROR;
+ }
+ }
+ }
+
+ return NGX_OK;
+}
_______________________________________________
nginx-devel mailing list
nginx-devel@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-devel
Subject Author Views Posted

[PATCH] QUIC: OpenSSL compatibility layer

Roman Arutyunyan 1208 December 21, 2022 02:08AM

Re: [PATCH] QUIC: OpenSSL compatibility layer

Roman Arutyunyan 132 January 09, 2023 06:14AM

Re: [PATCH] QUIC: OpenSSL compatibility layer

Sergey Kandaurov 138 February 02, 2023 01:36PM

Re: [PATCH] QUIC: OpenSSL compatibility layer

Roman Arutyunyan 119 February 06, 2023 09:28AM

Re: [PATCH] QUIC: OpenSSL compatibility layer

Sergey Kandaurov 120 February 08, 2023 07:30AM

Re: [PATCH] QUIC: OpenSSL compatibility layer

Roman Arutyunyan 123 February 08, 2023 09:42AM

Re: [PATCH] QUIC: OpenSSL compatibility layer

Sergey Kandaurov 129 February 08, 2023 10:18AM

Re: [PATCH] QUIC: OpenSSL compatibility layer

Roman Arutyunyan 109 February 22, 2023 09:22AM

Re: [PATCH] QUIC: OpenSSL compatibility layer

Sergey Kandaurov 99 March 23, 2023 09:20AM

Re: [PATCH] QUIC: OpenSSL compatibility layer

Roman Arutyunyan 127 March 23, 2023 09:54AM



Sorry, you do not have permission to post/reply in this forum.

Online Users

Guests: 311
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready