On Sun, Jul 07, 2013 at 10:17:11PM -0700, Aaron Stellman wrote:

> On Mon, Jul 08, 2013 at 07:06:43AM +0200, Otto Moerbeek wrote:
> > I think you missed the renogiate case. Anyway, I posted almost the
> > same diff some time ago.
> 
> You're right -- renegotiate case was missed. Your patch from April looks
> fine to me. It would be beneficial to have it committed.
> 
> Thanks

As gunther@ kindly remarked, there was a small issue: AP_SRV_CMD
versus my AP_ALL_CMD in my original diff. So this is the diff I am
going to commit unless sombody objects quickly.

        -Otto

Index: src/modules/ssl/mod_ssl.c
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/src/modules/ssl/mod_ssl.c,v
retrieving revision 1.10
diff -u -p -r1.10 mod_ssl.c
--- src/modules/ssl/mod_ssl.c   14 Oct 2007 15:12:59 -0000      1.10
+++ src/modules/ssl/mod_ssl.c   10 Jul 2013 08:26:47 -0000
@@ -107,6 +107,9 @@ static command_rec ssl_config_cmds[] = {
     AP_SRV_CMD(Engine, FLAG,
                "SSL switch for the protocol engine "
                "(`on', `off')")
+    AP_SRV_CMD(HonorCipherOrder, TAKE1,
+               "Let the server determine preferred ciphers "
+               "(`on', `off'")
     AP_ALL_CMD(CipherSuite, TAKE1,
                "Colon-delimited list of permitted SSL Ciphers "
                "(`XXX:...:XXX' - see manual)")
Index: src/modules/ssl/mod_ssl.h
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/src/modules/ssl/mod_ssl.h,v
retrieving revision 1.21
diff -u -p -r1.21 mod_ssl.h
--- src/modules/ssl/mod_ssl.h   4 Apr 2006 08:51:28 -0000       1.21
+++ src/modules/ssl/mod_ssl.h   10 Jul 2013 08:26:47 -0000
@@ -516,6 +516,7 @@ typedef struct {
     char        *szCipherSuite;
     FILE        *fileLogFile;
     int          nLogLevel;
+    BOOL         cipher_server_pref;
     int          nVerifyDepth;
     ssl_verify_t nVerifyClient;
     X509        *pPublicCert[SSL_AIDX_MAX];
@@ -589,6 +590,7 @@ const char  *ssl_cmd_SSLPassPhraseDialog
 const char  *ssl_cmd_SSLCryptoDevice(cmd_parms *, char *, char *);
 const char  *ssl_cmd_SSLRandomSeed(cmd_parms *, char *, char *, char *, char 
*);
 const char  *ssl_cmd_SSLEngine(cmd_parms *, char *, int);
+const char  *ssl_cmd_SSLHonorCipherOrder(cmd_parms *, char *, int);
 const char  *ssl_cmd_SSLCipherSuite(cmd_parms *, SSLDirConfigRec *, char *);
 const char  *ssl_cmd_SSLCertificateFile(cmd_parms *, char *, char *);
 const char  *ssl_cmd_SSLCertificateKeyFile(cmd_parms *, char *, char *);
Index: src/modules/ssl/ssl_engine_config.c
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/src/modules/ssl/ssl_engine_config.c,v
retrieving revision 1.19
diff -u -p -r1.19 ssl_engine_config.c
--- src/modules/ssl/ssl_engine_config.c 27 May 2008 10:17:24 -0000      1.19
+++ src/modules/ssl/ssl_engine_config.c 10 Jul 2013 08:26:47 -0000
@@ -197,6 +197,7 @@ void *ssl_config_server_create(pool *p, 
     sc->szLogFile              = NULL;
     sc->szCipherSuite          = NULL;
     sc->nLogLevel              = SSL_LOG_NONE;
+    sc->cipher_server_pref     = UNSET;
     sc->nVerifyDepth           = UNSET;
     sc->nVerifyClient          = SSL_CVERIFY_UNSET;
     sc->nSessionCacheTimeout   = UNSET;
@@ -252,6 +253,7 @@ void *ssl_config_server_merge(pool *p, v
     cfgMergeString(szCertificateChain);
     cfgMergeString(szLogFile);
     cfgMergeString(szCipherSuite);
+    cfgMergeBool(cipher_server_pref);
     cfgMerge(nLogLevel, SSL_LOG_NONE);
     cfgMergeInt(nVerifyDepth);
     cfgMerge(nVerifyClient, SSL_CVERIFY_UNSET);
@@ -527,6 +529,14 @@ const char *ssl_cmd_SSLEngine(
     SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
 
     sc->bEnabled = (flag ? TRUE : FALSE);
+    return NULL;
+}
+
+const char *ssl_cmd_SSLHonorCipherOrder(
+     cmd_parms *cmd, char *struct_ptr, int flag)
+{
+    SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
+    sc->cipher_server_pref = flag?TRUE:FALSE;
     return NULL;
 }
 
Index: src/modules/ssl/ssl_engine_init.c
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/src/modules/ssl/ssl_engine_init.c,v
retrieving revision 1.28
diff -u -p -r1.28 ssl_engine_init.c
--- src/modules/ssl/ssl_engine_init.c   7 Jul 2012 17:08:17 -0000       1.28
+++ src/modules/ssl/ssl_engine_init.c   10 Jul 2013 08:26:47 -0000
@@ -589,6 +589,8 @@ void ssl_init_ConfigureServer(server_rec
         SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv3);
     if (!(sc->nProtocol & SSL_PROTOCOL_TLSV1))
         SSL_CTX_set_options(ctx, SSL_OP_NO_TLSv1);
+    if (sc->cipher_server_pref == TRUE)
+       SSL_CTX_set_options(ctx, SSL_OP_CIPHER_SERVER_PREFERENCE);
     SSL_CTX_set_app_data(ctx, s);
     sc->pSSLCtx = ctx;
 
Index: src/modules/ssl/ssl_engine_kernel.c
===================================================================
RCS file: /cvs/src/usr.sbin/httpd/src/modules/ssl/ssl_engine_kernel.c,v
retrieving revision 1.25
diff -u -p -r1.25 ssl_engine_kernel.c
--- src/modules/ssl/ssl_engine_kernel.c 22 Jul 2008 11:20:10 -0000      1.25
+++ src/modules/ssl/ssl_engine_kernel.c 10 Jul 2013 08:26:47 -0000
@@ -801,9 +801,12 @@ int ssl_hook_Access(request_rec *r)
         if (skCipherOld != NULL)
             sk_SSL_CIPHER_free(skCipherOld);
         /* tracing */
-        if (renegotiate)
+        if (renegotiate) {
+           if (sc->cipher_server_pref == TRUE)
+               SSL_set_options(ssl, SSL_OP_CIPHER_SERVER_PREFERENCE);
             ssl_log(r->server, SSL_LOG_TRACE,
                     "Reconfigured cipher suite will force renegotiation");
+       }
     }
 
     /*

Reply via email to