[PATCH 1 of 2] SSL: support for TLSv1.3 certificate compression (RFC 8879)
Maxim Dounin
mdounin at mdounin.ru
Mon Apr 17 05:21:19 UTC 2023
Hello!
On Wed, Apr 12, 2023 at 04:55:49PM +0400, Sergey Kandaurov wrote:
> # HG changeset patch
> # User Sergey Kandaurov <pluknet at nginx.com>
> # Date 1681304029 -14400
> # Wed Apr 12 16:53:49 2023 +0400
> # Node ID 06458cd5733cd2ffaa4e2d26d357524a0934a7eb
> # Parent 5f1d05a21287ba0290dd3a17ad501595b442a194
> SSL: support for TLSv1.3 certificate compression (RFC 8879).
>
> Certificates are precompressed using the "ssl_certificate_compression"
> directive, disabled by default. A negotiated certificate-compression
> algorithm depends on the OpenSSL library builtin support.
While not exactly relevant to the patch, looking into OpenSSL's
master branch I don't see any obvious limits on the certificate
expansion, except the fact that uncompressed length is limited to
a 24-bit value. Is it indeed an easy way to allocate 16 MB per
connection?
(When I see "OpenSSL" and "compression" used together, I tend to
look for a resource usage audit, a security audit, and the "no
compression" option.)
Also, it might make sense to add a note to the commit log that
this functionality is expected to appear in OpenSSL 3.2.
>
> diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
> --- a/src/event/ngx_event_openssl.c
> +++ b/src/event/ngx_event_openssl.c
> @@ -847,6 +847,29 @@ ngx_ssl_password_callback(char *buf, int
>
>
> ngx_int_t
> +ngx_ssl_certificate_compression(ngx_conf_t *cf, ngx_ssl_t *ssl,
> + ngx_uint_t enable)
> +{
> + if (!enable) {
> + return NGX_OK;
> + }
> +
> +#ifdef TLSEXT_comp_cert_none
> +
> + if (SSL_CTX_compress_certs(ssl->ctx, 0)) {
> + return NGX_OK;
> + }
> +
> +#endif
> +
> + ngx_log_error(NGX_LOG_WARN, ssl->log, 0,
> + "\"ssl_certificate_compression\" ignored, not supported");
Please note that this option, contrary to the name, does not
enable certificate compression, but rather pre-compresses server
certificates.
Certificate compression is enabled by default for both client and
server connections, and both sending and receiving certificates,
unless disabled by the SSL_OP_NO_TX_CERTIFICATE_COMPRESSION /
SSL_OP_NO_RX_CERTIFICATE_COMPRESSION options. (Further,
client-side seems to compress client certificates on each
connection, which looks suboptimal for proxying to SSL upstream
servers with client certificates.)
It might worth looking for a better name, or expanding the
directive to actually disable compression unless it is enabled.
[...]
--
Maxim Dounin
http://mdounin.ru/
More information about the nginx-devel
mailing list