0e3136
# ./pullrev.sh 1869842
0e3136
http://svn.apache.org/viewvc?view=revision&revision=1869842
0e3136
0e3136
--- httpd-2.4.48/modules/ssl/ssl_engine_config.c.r1869842
0e3136
+++ httpd-2.4.48/modules/ssl/ssl_engine_config.c
0e3136
@@ -75,6 +75,10 @@
0e3136
     mc->stapling_refresh_mutex = NULL;
0e3136
 #endif
0e3136
 
0e3136
+#ifdef HAVE_OPENSSL_KEYLOG
0e3136
+    mc->keylog_file = NULL;
0e3136
+#endif
0e3136
+
0e3136
     apr_pool_userdata_set(mc, SSL_MOD_CONFIG_KEY,
0e3136
                           apr_pool_cleanup_null,
0e3136
                           pool);
0e3136
--- httpd-2.4.48/modules/ssl/ssl_engine_init.c.r1869842
0e3136
+++ httpd-2.4.48/modules/ssl/ssl_engine_init.c
0e3136
@@ -445,6 +445,28 @@
0e3136
     init_bio_methods();
0e3136
 #endif
0e3136
 
0e3136
+#ifdef HAVE_OPENSSL_KEYLOG
0e3136
+    {
0e3136
+        const char *logfn = getenv("SSLKEYLOGFILE");
0e3136
+
0e3136
+        if (logfn) {
0e3136
+            rv = apr_file_open(&mc->keylog_file, logfn,
0e3136
+                               APR_FOPEN_CREATE|APR_FOPEN_WRITE|APR_FOPEN_APPEND|APR_FOPEN_LARGEFILE,
0e3136
+                               APR_FPROT_UREAD|APR_FPROT_UWRITE,
0e3136
+                               mc->pPool);
0e3136
+            if (rv) {
0e3136
+                ap_log_error(APLOG_MARK, APLOG_NOTICE, rv, s, APLOGNO(10226)
0e3136
+                             "Could not open log file '%s' configured via SSLKEYLOGFILE",
0e3136
+                             logfn);
0e3136
+                return rv;
0e3136
+            }
0e3136
+
0e3136
+            ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, s, APLOGNO(10227)
0e3136
+                         "Init: Logging SSL private key material to %s", logfn);
0e3136
+        }
0e3136
+    }
0e3136
+#endif
0e3136
+    
0e3136
     return OK;
0e3136
 }
0e3136
 
0e3136
@@ -806,6 +828,12 @@
0e3136
      * https://github.com/openssl/openssl/issues/7178 */
0e3136
     SSL_CTX_clear_mode(ctx, SSL_MODE_AUTO_RETRY);
0e3136
 #endif
0e3136
+
0e3136
+#ifdef HAVE_OPENSSL_KEYLOG
0e3136
+    if (mctx->sc->mc->keylog_file) {
0e3136
+        SSL_CTX_set_keylog_callback(ctx, modssl_callback_keylog);
0e3136
+    }
0e3136
+#endif
0e3136
     
0e3136
     return APR_SUCCESS;
0e3136
 }
0e3136
--- httpd-2.4.48/modules/ssl/ssl_engine_kernel.c.r1869842
0e3136
+++ httpd-2.4.48/modules/ssl/ssl_engine_kernel.c
0e3136
@@ -2822,3 +2822,17 @@
0e3136
 }
0e3136
 
0e3136
 #endif /* HAVE_SRP */
0e3136
+
0e3136
+
0e3136
+#ifdef HAVE_OPENSSL_KEYLOG
0e3136
+/* Callback used with SSL_CTX_set_keylog_callback. */
0e3136
+void modssl_callback_keylog(const SSL *ssl, const char *line)
0e3136
+{
0e3136
+    conn_rec *conn = SSL_get_app_data(ssl);
0e3136
+    SSLSrvConfigRec *sc = mySrvConfig(conn->base_server);
0e3136
+
0e3136
+    if (sc && sc->mc->keylog_file) {
0e3136
+        apr_file_printf(sc->mc->keylog_file, "%s\n", line);
0e3136
+    }
0e3136
+}
0e3136
+#endif
0e3136
--- httpd-2.4.48/modules/ssl/ssl_private.h.r1869842
0e3136
+++ httpd-2.4.48/modules/ssl/ssl_private.h
0e3136
@@ -252,6 +252,10 @@
0e3136
 #endif
0e3136
 #endif
0e3136
 
0e3136
+#if OPENSSL_VERSION_NUMBER >= 0x10101000L && !defined(LIBRESSL_VERSION_NUMBER)
0e3136
+#define HAVE_OPENSSL_KEYLOG
0e3136
+#endif
0e3136
+
0e3136
 /* mod_ssl headers */
0e3136
 #include "ssl_util_ssl.h"
0e3136
 
0e3136
@@ -620,6 +624,11 @@
0e3136
     apr_global_mutex_t   *stapling_cache_mutex;
0e3136
     apr_global_mutex_t   *stapling_refresh_mutex;
0e3136
 #endif
0e3136
+
0e3136
+#ifdef HAVE_OPENSSL_KEYLOG
0e3136
+    /* Used for logging if SSLKEYLOGFILE is set at startup. */
0e3136
+    apr_file_t      *keylog_file;
0e3136
+#endif
0e3136
 } SSLModConfigRec;
0e3136
 
0e3136
 /** Structure representing configured filenames for certs and keys for
0e3136
@@ -979,6 +988,11 @@
0e3136
 int          ssl_callback_SRPServerParams(SSL *, int *, void *);
0e3136
 #endif
0e3136
 
0e3136
+#ifdef HAVE_OPENSSL_KEYLOG
0e3136
+/* Callback used with SSL_CTX_set_keylog_callback. */
0e3136
+void         modssl_callback_keylog(const SSL *ssl, const char *line);
0e3136
+#endif
0e3136
+
0e3136
 /**  I/O  */
0e3136
 void         ssl_io_filter_init(conn_rec *, request_rec *r, SSL *);
0e3136
 void         ssl_io_filter_register(apr_pool_t *);