freenginx-1.27.5
Maxim Dounin
mdounin at mdounin.ru
Sun Apr 13 16:16:10 UTC 2025
Hello!
On Thu, Apr 10, 2025 at 10:15:06PM +0200, A. Schulze via nginx wrote:
> Am 10.04.25 um 07:09 schrieb Maxim Dounin:
> > OTOH, you may try the following patch which tries to use
> > SSL_get0_group_name() and SSL_group_to_name() if available.
> >
> > Note thought that it slightly changes names as seen in the
> > $ssl_curve and $ssl_curves variables. In particular, with OpenSSL
> > 3.5 both on the server and as a client, variables are changed
> > from:
> >
> > $ssl_curve: 0x11ec
> > $ssl_curves: 0x11ec:X25519:prime256v1:X448:secp384r1:secp521r1:ffdhe2048:ffdhe3072
> >
> > to the following:
> >
> > $ssl_curve: X25519MLKEM768
> > $ssl_curves: X25519MLKEM768:x25519:secp256r1:x448:secp384r1:secp521r1:ffdhe2048:ffdhe3072
> >
> > Note "X25519" changed to "x25519", and "prime256v1" to
> > "secp256r1".
> >
> > Please let me know what do you think.
>
> Hello Maxim,
>
> the patch let freenginx use the expected names I personally prefer over hex numbers.
> I don't care if I read X25519 or x25519. I also do not know a scenario, where these names matter.
> But this doesn't mean, they do not exist. If the would exist, an operator may with to
> decide/configure, which names nginx should use.
Thanks for the feedback.
Here is an updated path, which instead uses NIDs as before to
preserve existing names, and SSL_group_to_name() only if NID is
not found. Main benefit of this approach is that names are
consistent across various SSL libraries, such as different
versions of OpenSSL and BoringSSL.
# HG changeset patch
# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1744560375 -10800
# Sun Apr 13 19:06:15 2025 +0300
# Node ID e6805fbe81004faafe47d69fb267e4a6b4b0cfbf
# Parent 0a8083b7093e88a56b6b06d534b52c367728d005
SSL: improved handling of $ssl_curve and $ssl_curves variables.
Now both $ssl_curve and $ssl_curves try to use SSL_group_to_name()
if available and no NID is found. Notably, this makes it possible to
see the name of the X25519MLKEM768 group as supported by OpenSSL 3.5.0.
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
@@ -5270,6 +5270,26 @@ ngx_ssl_get_curve(ngx_connection_t *c, n
return NGX_OK;
}
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+ {
+ u_char *name;
+
+ name = (u_char *) SSL_group_to_name(c->ssl->connection, nid);
+
+ if (name) {
+ s->len = ngx_strlen(name);
+
+ s->data = ngx_pnalloc(pool, s->len);
+ if (s->data == NULL) {
+ return NGX_ERROR;
+ }
+
+ ngx_memcpy(s->data, name, s->len);
+ return NGX_OK;
+ }
+ }
+#endif
+
s->len = sizeof("0x0000") - 1;
s->data = ngx_pnalloc(pool, s->len);
@@ -5292,10 +5312,13 @@ ngx_ssl_get_curve(ngx_connection_t *c, n
ngx_int_t
ngx_ssl_get_curves(ngx_connection_t *c, ngx_pool_t *pool, ngx_str_t *s)
{
-#ifdef SSL_CTRL_GET_CURVES
+#ifdef SSL_get1_curves
int *curves, n, i, nid;
u_char *p;
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+ u_char *name;
+#endif
size_t len;
n = SSL_get1_curves(c->ssl->connection, NULL);
@@ -5316,12 +5339,25 @@ ngx_ssl_get_curves(ngx_connection_t *c,
for (i = 0; i < n; i++) {
nid = curves[i];
- if (nid & TLSEXT_nid_unknown) {
- len += sizeof("0x0000") - 1;
-
- } else {
+ if ((nid & TLSEXT_nid_unknown) == 0) {
len += ngx_strlen(OBJ_nid2sn(nid));
- }
+ goto next_length;
+ }
+
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+
+ name = (u_char *) SSL_group_to_name(c->ssl->connection, nid);
+
+ if (name) {
+ len += ngx_strlen(name);
+ goto next_length;
+ }
+
+#endif
+
+ len += sizeof("0x0000") - 1;
+
+ next_length:
len += sizeof(":") - 1;
}
@@ -5336,12 +5372,26 @@ ngx_ssl_get_curves(ngx_connection_t *c,
for (i = 0; i < n; i++) {
nid = curves[i];
- if (nid & TLSEXT_nid_unknown) {
- p = ngx_sprintf(p, "0x%04xd", nid & 0xffff);
-
- } else {
+ if ((nid & TLSEXT_nid_unknown) == 0) {
p = ngx_sprintf(p, "%s", OBJ_nid2sn(nid));
- }
+ goto next_value;
+
+ }
+
+#if OPENSSL_VERSION_NUMBER >= 0x30000000L
+
+ name = (u_char *) SSL_group_to_name(c->ssl->connection, nid);
+
+ if (name) {
+ p = ngx_sprintf(p, "%s", name);
+ goto next_value;
+ }
+
+#endif
+
+ p = ngx_sprintf(p, "0x%04xd", nid & 0xffff);
+
+ next_value:
*p++ = ':';
}
--
Maxim Dounin
http://mdounin.ru/
More information about the nginx
mailing list