]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
mod_ssl: Drop SSLRandomSeed implementation with OpenSSL 1.1.1.
authorJoe Orton <jorton@apache.org>
Thu, 7 May 2020 10:34:12 +0000 (10:34 +0000)
committerJoe Orton <jorton@apache.org>
Thu, 7 May 2020 10:34:12 +0000 (10:34 +0000)
Require that OpenSSL is configured with a suitable entropy source,
or fail startup otherwise.

* modules/ssl/ssl_private.h:
  Define MODSSL_USE_SSLRAND for OpenSSL < 1.1.1.
  (SSLModConfigRec): Only define pid, aRandSeed for <1.1.1.
  (ssl_rand_seed): Define as noop if !MODSSL_USE_SSLRAND.

* modules/ssl/ssl_engine_init.c (ssl_init_Module):
  Only initialize mc->pid for MODSSL_USE_SSLRAND.
  Fail if RAND_status() returns zero.
  (ssl_init_Child): Drop getpid and srand for !MODSSL_USE_SSLRAND.

* modules/ssl/ssl_engine_rand.c: ifdef-out for !MODSSL_USE_SSLRAND.
  (ssl_rand_seed): Drop warning if PRNG not seeded (now a startup
  error as above).

* modules/ssl/ssl_engine_config.c (ssl_config_global_create): Drop
  aRandSeed initialization.  (ssl_cmd_SSLRandomSeed): Log a warning if
  used w/!MODSSL_USE_SSLRAND.

Github: closes #123

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1877467 13f79535-47bb-0310-9956-ffa450edef68

CHANGES
docs/log-message-tags/next-number
modules/ssl/ssl_engine_config.c
modules/ssl/ssl_engine_init.c
modules/ssl/ssl_engine_rand.c
modules/ssl/ssl_private.h

diff --git a/CHANGES b/CHANGES
index 0e1b976bf55cafa7bb1367814923bd9bb7b578bd..7250cdab2ee30149b25d5e76bbcd3866683c063c 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,10 @@
                                                          -*- coding: utf-8 -*-
 Changes with Apache 2.5.1
 
+  *) mod_ssl: With OpenSSL 1.1.1 and later, SSLRandomSeed is now
+     ignored.  OpenSSL must be configured with a suitable entropy
+     source, or mod_ssl will fail to start up.  [Joe Orton]
+
   *) mod_ssl: With OpenSSL 1.1.1 and later, client-initiated
      renegotiation in TLSv1.2 and earlier is blocked at SSL library
      level (with a TLS warning alert sent), rather than by aborting
index 5ed9a8cf20e3b0c6b9a3d7c2558ae1f1a19ea3db..e41aa417c3b074bbac8450467a6a5b5260a49a07 100644 (file)
@@ -1 +1 @@
-10235
+10236
index b0faf55b82256de0f68aa46560b66c2ab0beaf4e..4d57e522ec402289d0f4f1e478281b5fa640485a 100644 (file)
@@ -59,8 +59,10 @@ static SSLModConfigRec *ssl_config_global_create(apr_pool_t *pool, server_rec *s
      * initialize per-module configuration
      */
     mc->sesscache_mode         = SSL_SESS_CACHE_OFF;
+#ifdef MODSSL_USE_SSLRAND
     mc->aRandSeed              = apr_array_make(pool, 4,
                                                 sizeof(ssl_randseed_t));
+#endif
 #ifdef HAVE_FIPS
     mc->fips = UNSET;
 #endif
@@ -713,6 +715,7 @@ const char *ssl_cmd_SSLRandomSeed(cmd_parms *cmd,
                                   const char *arg2,
                                   const char *arg3)
 {
+#ifdef MODSSL_USE_SSLRAND
     SSLModConfigRec *mc = myModConfig(cmd->server);
     const char *err;
     ssl_randseed_t *seed;
@@ -801,6 +804,12 @@ const char *ssl_cmd_SSLRandomSeed(cmd_parms *cmd,
         }
     }
 
+#else
+    ap_log_error(APLOG_MARK, APLOG_WARNING, 0, cmd->server, APLOGNO(10235)
+                 "SSLRandomSeed is deprecated and has no effect "
+                 "with OpenSSL 1.1.1 and later");
+#endif
+
     return NULL;
 }
 
index 129d09824a37499d7281d1856bd93f7d8a897a53..e3209f3e97d9319947eac6fb157ea6824289afba 100644 (file)
@@ -237,11 +237,13 @@ apr_status_t ssl_init_Module(apr_pool_t *p, apr_pool_t *plog,
                      MODSSL_LIBRARY_TEXT, MODSSL_LIBRARY_DYNTEXT);
     }
 
+#ifdef MODSSL_USE_SSLRAND
     /* We initialize mc->pid per-process in the child init,
      * but it should be initialized for startup before we
      * call ssl_rand_seed() below.
      */
     mc->pid = getpid();
+#endif
 
     /*
      * Let us cleanup on restarts and exits
@@ -330,6 +332,14 @@ apr_status_t ssl_init_Module(apr_pool_t *p, apr_pool_t *plog,
      */
     ssl_rand_seed(base_server, ptemp, SSL_RSCTX_STARTUP, "Init: ");
 
+    if (RAND_status() == 0) {
+        ap_log_error(APLOG_MARK, APLOG_CRIT, 0, base_server, APLOGNO(01990)
+                     MODSSL_LIBRARY_NAME " PRNG does not contain sufficient "
+                     "randomness.  Build the SSL library with a suitable "
+                     "entropy source configured.");
+        return APR_EGENERAL;
+    }
+
 #ifdef HAVE_FIPS
     if (!FIPS_mode() && mc->fips == TRUE) {
         if (!FIPS_mode_set(1)) {
@@ -2277,11 +2287,13 @@ STACK_OF(X509_NAME) *ssl_init_FindCAList(server_rec *s,
 
 void ssl_init_Child(apr_pool_t *p, server_rec *s)
 {
+#ifdef MODSSL_USE_SSLRAND
     SSLModConfigRec *mc = myModConfig(s);
     mc->pid = getpid(); /* only call getpid() once per-process */
 
     /* XXX: there should be an ap_srand() function */
     srand((unsigned int)time(NULL));
+#endif
 
     /* open the mutex lockfile */
     ssl_mutex_reinit(s, p);
index 3b6bf076133e5402c1a237ce6a6953f2f2154e72..b9445268eba050e7f97de34307d92424b6d11365 100644 (file)
@@ -29,6 +29,8 @@
 
 #include "ssl_private.h"
 
+#ifdef MODSSL_USE_SSLRAND
+
 #if HAVE_VALGRIND
 #include <valgrind.h>
 #include <memcheck.h>
@@ -43,7 +45,7 @@
 static int ssl_rand_choosenum(int, int);
 static int ssl_rand_feedfp(apr_pool_t *, apr_file_t *, int);
 
-int ssl_rand_seed(server_rec *s, apr_pool_t *p, ssl_rsctx_t nCtx, char *prefix)
+void ssl_rand_seed(server_rec *s, apr_pool_t *p, ssl_rsctx_t nCtx, char *prefix)
 {
     SSLModConfigRec *mc;
     apr_array_header_t *apRandSeed;
@@ -134,12 +136,6 @@ int ssl_rand_seed(server_rec *s, apr_pool_t *p, ssl_rsctx_t nCtx, char *prefix)
     }
     ap_log_error(APLOG_MARK, APLOG_TRACE2, 0, s,
                  "%sSeeding PRNG with %d bytes of entropy", prefix, nDone);
-
-    if (RAND_status() == 0)
-        ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s, APLOGNO(01990)
-                     "%sPRNG still contains insufficient entropy!", prefix);
-
-    return nDone;
 }
 
 #define BUFSIZE 8192
@@ -185,3 +181,4 @@ static int ssl_rand_choosenum(int l, int h)
     return i;
 }
 
+#endif /* MODSSL_USE_SSLRAND */
index a4b88a531df6a7ed0c6d4edc847c4f7c772df603..d7d71ec26a4050463cbaa3fddd75e736202b3363 100644 (file)
 #define MODSSL_USE_OPENSSL_PRE_1_1_API (OPENSSL_VERSION_NUMBER < 0x10100000L)
 #endif
 
+#if OPENSSL_VERSION_NUMBER < 0x10101000
+#define MODSSL_USE_SSLRAND
+#endif
+
 #if defined(OPENSSL_FIPS)
 #define HAVE_FIPS
 #endif
@@ -590,7 +594,6 @@ typedef struct {
 } modssl_retained_data_t;
 
 typedef struct {
-    pid_t           pid;
     BOOL            bFixed;
 
     /* OpenSSL SSL_SESS_CACHE_* flags: */
@@ -605,7 +608,11 @@ typedef struct {
     ap_socache_instance_t *sesscache_context;
 
     apr_global_mutex_t   *pMutex;
+
+#ifdef MODSSL_USE_SSLRAND
+    pid_t           pid; /* used for seeding after fork() */
     apr_array_header_t   *aRandSeed;
+#endif
 
 #if defined(HAVE_OPENSSL_ENGINE_H) && defined(HAVE_ENGINE_INIT)
     const char     *szCryptoDevice;
@@ -1008,8 +1015,12 @@ long         ssl_io_data_cb(BIO *, int, const char *, int, long, long);
  * to allow an SSL renegotiation to take place. */
 int          ssl_io_buffer_fill(request_rec *r, apr_size_t maxlen);
 
+#ifdef MODSSL_USE_SSLRAND
 /**  PRNG  */
-int          ssl_rand_seed(server_rec *, apr_pool_t *, ssl_rsctx_t, char *);
+void         ssl_rand_seed(server_rec *, apr_pool_t *, ssl_rsctx_t, char *);
+#else
+#define      ssl_rand_seed(s, p, ctx, c) /* noop */
+#endif
 
 /**  Utility Functions  */
 char        *ssl_util_vhostid(apr_pool_t *, server_rec *);