Disable all TLS session tickets
authorDaniel Gustafsson <dgustafsson@postgresql.org>
Fri, 26 Jul 2024 09:09:45 +0000 (11:09 +0200)
committerDaniel Gustafsson <dgustafsson@postgresql.org>
Fri, 26 Jul 2024 09:09:45 +0000 (11:09 +0200)
OpenSSL supports two types of session tickets for TLSv1.3, stateless
and stateful. The option we've used only turns off stateless tickets
leaving stateful tickets active. Use the new API introduced in 1.1.1
to disable all types of tickets.

Backpatch to all supported versions.

Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi>
Reported-by: Andres Freund <andres@anarazel.de>
Discussion: https://postgr.es/m/20240617173803.6alnafnxpiqvlh3g@awork3.anarazel.de
Backpatch-through: v12

configure
configure.ac
meson.build
src/backend/libpq/be-secure-openssl.c
src/include/pg_config.h.in

index 062d40e1ab2af8ed59c5b283c550f740ead6ea47..ea5514fab1a3c492a72da668a0dc593305868711 100755 (executable)
--- a/configure
+++ b/configure
 done
 
   # Function introduced in OpenSSL 1.1.1.
-  for ac_func in X509_get_signature_info
+  for ac_func in X509_get_signature_info SSL_CTX_set_num_tickets
 do :
-  ac_fn_c_check_func "$LINENO" "X509_get_signature_info" "ac_cv_func_X509_get_signature_info"
-if test "x$ac_cv_func_X509_get_signature_info" = xyes; then :
+  as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
+ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
+if eval test \"x\$"$as_ac_var"\" = x"yes"; then :
   cat >>confdefs.h <<_ACEOF
-#define HAVE_X509_GET_SIGNATURE_INFO 1
+#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1
 _ACEOF
 
 fi
index ef56226156a8bbaa9b83b6f807cda7ec861e70f2..0089e78b687ae8413b81b211b2b762284401cba9 100644 (file)
@@ -1358,7 +1358,7 @@ if test "$with_ssl" = openssl ; then
   # function was removed.
   AC_CHECK_FUNCS([CRYPTO_lock])
   # Function introduced in OpenSSL 1.1.1.
-  AC_CHECK_FUNCS([X509_get_signature_info])
+  AC_CHECK_FUNCS([X509_get_signature_info SSL_CTX_set_num_tickets])
   AC_DEFINE([USE_OPENSSL], 1, [Define to 1 to build with OpenSSL support. (--with-ssl=openssl)])
 elif test "$with_ssl" != no ; then
   AC_MSG_ERROR([--with-ssl must specify openssl])
index efde3a28cc91efaee55e60beb5449d52cb0c71ff..c02bac35d67298c0fbfee5898ed41914de7b4f84 100644 (file)
@@ -1362,6 +1362,7 @@ if sslopt in ['auto', 'openssl']
 
       # Function introduced in OpenSSL 1.1.1
       ['X509_get_signature_info'],
+      ['SSL_CTX_set_num_tickets'],
     ]
 
     are_openssl_funcs_complete = true
index 387f30cdaa89836e5718ade3b4df1447338d37fd..eed7ec7ce56a75c4ad10c17fb99f8a17e92dd4ef 100644 (file)
@@ -259,8 +259,20 @@ be_tls_init(bool isServerStart)
                }
        }
 
-       /* disallow SSL session tickets */
+       /*
+        * Disallow SSL session tickets. OpenSSL use both stateful and stateless
+        * tickets for TLSv1.3, and stateless ticket for TLSv1.2. SSL_OP_NO_TICKET
+        * is available since 0.9.8f but only turns off stateless tickets. In
+        * order to turn off stateful tickets we need SSL_CTX_set_num_tickets,
+        * which is available since OpenSSL 1.1.1.  LibreSSL 3.5.4 (from OpenBSD
+        * 7.1) introduced this API for compatibility, but doesn't support session
+        * tickets at all so it's a no-op there.
+        */
+#ifdef HAVE_SSL_CTX_SET_NUM_TICKETS
+       SSL_CTX_set_num_tickets(context, 0);
+#else
        SSL_CTX_set_options(context, SSL_OP_NO_TICKET);
+#endif
 
        /* disallow SSL session caching, too */
        SSL_CTX_set_session_cache_mode(context, SSL_SESS_CACHE_OFF);
index 9862739b8e8e1af642fac0c796a877aabb61c301..db3fcbecc3ab33c8593eeb4a6d2927f674e2f684 100644 (file)
 /* Define to 1 if you have the `X509_get_signature_info' function. */
 #undef HAVE_X509_GET_SIGNATURE_INFO
 
+/* Define to 1 if you have the `SSL_CTX_set_num_tickets' function. */
+#undef HAVE_SSL_CTX_SET_NUM_TICKETS
+
 /* Define to 1 if the assembler supports X86_64's POPCNTQ instruction. */
 #undef HAVE_X86_64_POPCNTQ