diff --git a/apache2-mod_nss.changes b/apache2-mod_nss.changes
index 36b3f4e..4fa0c5f 100644
--- a/apache2-mod_nss.changes
+++ b/apache2-mod_nss.changes
@@ -1,3 +1,15 @@
+-------------------------------------------------------------------
+Thu Aug 1 15:06:55 UTC 2013 - meissner@suse.com
+
+- Add support for TLS v1.1 and TLS v1.2
+ (TLS v1.2 requires mozilla nss 3.15.1 or newer.)
+ - merged in mod_nss-proxyvariables.patch and mod_nss-tlsv1_1.patch
+ from redhat to allow tls v1.1 too.
+ - ported the tls v1.1 patch to be tls v1.2 aware
+ - added mod_nss-proxyvariables.patch (from RHEL6 package)
+ - added mod_nss-tlsv1_1.patch (from RHEL6 package, enhanced with TLS 1.2)
+- mod_nss-array_overrun.patch: from RHEL6 package, fixed a array index overrun
+
-------------------------------------------------------------------
Fri Jul 12 10:42:06 UTC 2013 - aj@ajaissle.de
diff --git a/apache2-mod_nss.spec b/apache2-mod_nss.spec
index fa435f5..c22a7f3 100644
--- a/apache2-mod_nss.spec
+++ b/apache2-mod_nss.spec
@@ -1,7 +1,7 @@
#
# spec file for package apache2-mod_nss
#
-# Copyright (c) 2012 SUSE LINUX Products GmbH, Nuernberg, Germany.
+# Copyright (c) 2013 SUSE LINUX Products GmbH, Nuernberg, Germany.
#
# All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed
@@ -16,39 +16,44 @@
#
-Name: apache2-mod_nss
-Summary: SSL/TLS module for the Apache HTTP server
-Version: 1.0.8
-Release: 3
-Group: Productivity/Networking/Web/Servers
-License: Apache-2.0
-Url: http://directory.fedoraproject.org/wiki/Mod_nss
-Source: http://directory.fedoraproject.org/sources/mod_nss-%{version}.tar.gz
-Provides: mod_nss
-Requires: apache2 >= 2.0.52
-Requires: findutils
+Name: apache2-mod_nss
+Summary: SSL/TLS module for the Apache HTTP server
+License: Apache-2.0
+Group: Productivity/Networking/Web/Servers
+Version: 1.0.8
+Release: 0
+Url: http://directory.fedoraproject.org/wiki/Mod_nss
+Source: http://directory.fedoraproject.org/sources/mod_nss-%{version}.tar.gz
+Provides: mod_nss
+Requires: apache2 >= 2.0.52
+Requires: findutils
Requires(post): mozilla-nss-tools
-BuildRequires: bison
-BuildRequires: findutils
-BuildRequires: gcc-c++
-BuildRequires: libapr1-devel
-BuildRequires: libapr-util1-devel
-BuildRequires: mozilla-nspr-devel >= 4.6.3
-BuildRequires: mozilla-nss-devel >= 3.12.6
-BuildRequires: apache2-devel >= 2.0.52
-BuildRequires: pkgconfig
+BuildRequires: apache2-devel >= 2.0.52
+BuildRequires: bison
+BuildRequires: findutils
+BuildRequires: flex
+BuildRequires: gcc-c++
+BuildRequires: libapr-util1-devel
+BuildRequires: libapr1-devel
+BuildRequires: mozilla-nspr-devel >= 4.6.3
+BuildRequires: mozilla-nss-devel >= 3.12.6
+BuildRequires: pkgconfig
# [bnc#799483] Patch to adjust mod_nss.conf to match SUSE dir layout
-Patch1: mod_nss-conf.patch
-Patch2: mod_nss-gencert.patch
-Patch3: mod_nss-wouldblock.patch
-Patch4: mod_nss-negotiate.patch
-Patch5: mod_nss-reverseproxy.patch
-Patch6: mod_nss-pcachesignal.h
-Patch7: mod_nss-reseterror.patch
-Patch8: mod_nss-lockpcache.patch
+Patch1: mod_nss-conf.patch
+Patch2: mod_nss-gencert.patch
+Patch3: mod_nss-wouldblock.patch
+Patch4: mod_nss-negotiate.patch
+Patch5: mod_nss-reverseproxy.patch
+Patch6: mod_nss-pcachesignal.h
+Patch7: mod_nss-reseterror.patch
+Patch8: mod_nss-lockpcache.patch
# Fix build with apache 2.4
-Patch9: mod_nss-httpd24.patch
-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
+Patch9: mod_nss-httpd24.patch
+
+Patch10: mod_nss-proxyvariables.patch
+Patch11: mod_nss-tlsv1_1.patch
+Patch12: mod_nss-array_overrun.patch
+BuildRoot: %{_tmppath}/%{name}-%{version}-build
%define apxs /usr/sbin/apxs2
%define apache apache2
%define apache_libexecdir %(%{apxs} -q LIBEXECDIR)
@@ -76,6 +81,9 @@ security library.
%if 0%{?suse_version} >= 1300
%patch9 -p1 -b .http24
%endif
+%patch10 -p1 -b .proxyvariables
+%patch11 -p1 -b .tlsv1_1
+%patch12 -p1 -b .array_overrun
# Touch expression parser sources to prevent regenerating it
touch nss_expr_*.[chyl]
diff --git a/mod_nss-array_overrun.patch b/mod_nss-array_overrun.patch
new file mode 100644
index 0000000..10b84f8
--- /dev/null
+++ b/mod_nss-array_overrun.patch
@@ -0,0 +1,16 @@
+mod_nss-1.0.8/nss_engine_init.c:467: overrun-local: Overrunning static array
+"child_argv", with 5 elements, at position 5 with index variable "5".
+
+https://bugzilla.redhat.com/show_bug.cgi?id=714154
+diff -up --recursive mod_nss-1.0.8.orig/nss_engine_init.c mod_nss-1.0.8/nss_engine_init.c
+--- mod_nss-1.0.8.orig/nss_engine_init.c 2011-08-01 13:24:34.000000000 -0400
++++ mod_nss-1.0.8/nss_engine_init.c 2011-08-01 13:25:36.000000000 -0400
+@@ -429,7 +429,7 @@ int nss_init_Module(apr_pool_t *p, apr_p
+
+ /* Do we need to fire up our password helper? */
+ if (mc->nInitCount == 1) {
+- const char * child_argv[5];
++ const char * child_argv[6];
+ apr_status_t rv;
+ struct sembuf sb;
+ char sembuf[32];
diff --git a/mod_nss-proxyvariables.patch b/mod_nss-proxyvariables.patch
new file mode 100644
index 0000000..17090db
--- /dev/null
+++ b/mod_nss-proxyvariables.patch
@@ -0,0 +1,83 @@
+diff -rupN mod_nss-1.0.8.orig/nss_engine_init.c mod_nss-1.0.8/nss_engine_init.c
+--- mod_nss-1.0.8.orig/nss_engine_init.c 2012-10-03 14:28:50.751794000 -0700
++++ mod_nss-1.0.8/nss_engine_init.c 2012-10-04 16:33:08.278929000 -0700
+@@ -628,8 +628,21 @@ static void nss_init_ctx_protocol(server
+ tls = 1;
+ } else {
+ if (mctx->auth.protocols == NULL) {
+- ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
+- "NSSProtocols not set; using: SSLv3 and TLSv1");
++ /*
++ * Since this routine will be invoked individually for every
++ * thread associated with each 'server' object as well as for
++ * every thread associated with each 'proxy' object, issue a
++ * single per-thread 'warning' message for either a 'server'
++ * or a 'proxy' based upon the thread's object type.
++ */
++ if (mctx == mctx->sc->server) {
++ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
++ "NSSProtocol value not set; using: SSLv3 and TLSv1");
++ } else if (mctx == mctx->sc->proxy) {
++ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
++ "NSSProxyProtocol value not set; using: SSLv3 and TLSv1");
++ }
++
+ ssl3 = tls = 1;
+ } else {
+ lprotocols = strdup(mctx->auth.protocols);
+@@ -786,8 +799,25 @@ static void nss_init_ctx_cipher_suite(se
+ * Configure SSL Cipher Suite
+ */
+ if (!suite) {
+- ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+- "Required value NSSCipherSuite not set.");
++ /*
++ * Since this is a 'fatal' error, regardless of whether this
++ * particular invocation is from a 'server' object or a 'proxy'
++ * object, issue all error message(s) as appropriate.
++ */
++ if ((mctx->sc->enabled == TRUE) &&
++ (mctx->sc->server) &&
++ (!mctx->sc->server->auth.cipher_suite)) {
++ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
++ "NSSEngine on; required value NSSCipherSuite not set.");
++ }
++
++ if ((mctx->sc->proxy_enabled == TRUE) &&
++ (mctx->sc->proxy) &&
++ (!mctx->sc->proxy->auth.cipher_suite)) {
++ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
++ "NSSProxyEngine on; required value NSSProxyCipherSuite not set.");
++ }
++
+ nss_die();
+ }
+ ciphers = strdup(suite);
+@@ -1069,8 +1099,25 @@ static void nss_init_server_certs(server
+ if (mctx->nickname == NULL)
+ #endif
+ {
+- ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+- "No certificate nickname provided.");
++ /*
++ * Since this is a 'fatal' error, regardless of whether this
++ * particular invocation is from a 'server' object or a 'proxy'
++ * object, issue all error message(s) as appropriate.
++ */
++ if ((mctx->sc->enabled == TRUE) &&
++ (mctx->sc->server) &&
++ (mctx->sc->server->nickname == NULL)) {
++ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
++ "NSSEngine on; no certificate nickname provided by NSSNickname.");
++ }
++
++ if ((mctx->sc->proxy_enabled == TRUE) &&
++ (mctx->sc->proxy) &&
++ (mctx->sc->proxy->nickname == NULL)) {
++ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
++ "NSSProxyEngine on; no certificate nickname provided by NSSProxyNickname.");
++ }
++
+ nss_die();
+ }
+
diff --git a/mod_nss-tlsv1_1.patch b/mod_nss-tlsv1_1.patch
new file mode 100644
index 0000000..3ddfc97
--- /dev/null
+++ b/mod_nss-tlsv1_1.patch
@@ -0,0 +1,767 @@
+Index: mod_nss-1.0.8/docs/mod_nss.html
+===================================================================
+--- mod_nss-1.0.8.orig/docs/mod_nss.html
++++ mod_nss-1.0.8/docs/mod_nss.html
+@@ -466,7 +466,7 @@ Example
SSL_RSA_WITH_3DES_EDE_CBC_SHA
+
+-
SSLv3/TLSv1
++ | SSLv3/TLSv1.0/TLSv1.1/TLSv1.2
+ |
+
+
+@@ -578,106 +578,106 @@ definition
+
+ SSL_RSA_WITH_DES_CBC_SHA
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ rsa_null_md5
+ |
+ SSL_RSA_WITH_NULL_MD5
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ rsa_null_sha
+ |
+ SSL_RSA_WITH_NULL_SHA
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ rsa_rc2_40_md5 |
+ SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ rsa_rc4_128_md5 |
+ SSL_RSA_WITH_RC4_128_MD5
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ rsa_rc4_128_sha |
+ SSL_RSA_WITH_RC4_128_SHA
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ rsa_rc4_40_md5 |
+ SSL_RSA_EXPORT_WITH_RC4_40_MD5
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ fortezza
+ |
+ SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ fortezza_rc4_128_sha
+ |
+ SSL_FORTEZZA_DMS_WITH_RC4_128_SHA
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ fortezza_null
+ |
+ SSL_FORTEZZA_DMS_WITH_NULL_SHA
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ fips_des_sha
+ |
+ SSL_RSA_FIPS_WITH_DES_CBC_SHA
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ fips_3des_sha
+ |
+ SSL_RSA_FIPS_WITH_3DES_EDE_CBC_SHA
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ rsa_des_56_sha |
+ TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA
+ |
+- SSL3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ rsa_rc4_56_sha |
+ TLS_RSA_EXPORT1024_WITH_RC4_56_SHA
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ rsa_aes_128_sha
+ |
+ TLS_RSA_WITH_AES_128_CBC_SHA
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ rsa_aes_256_sha
+ |
+ TLS_RSA_WITH_AES_256_CBC_SHA
+ |
+- SSLv3/TLSv1 |
++ SSLv3/TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+
+@@ -698,127 +698,127 @@ Definition
+
+ ecdh_ecdsa_null_sha |
+ TLS_ECDH_ECDSA_WITH_NULL_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_ecdsa_rc4_128_sha |
+ TLS_ECDH_ECDSA_WITH_RC4_128_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_ecdsa_3des_sha |
+ TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_ecdsa_aes_128_sha |
+ TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_ecdsa_aes_256_sha |
+ TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdhe_ecdsa_null_sha |
+ TLS_ECDHE_ECDSA_WITH_NULL_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdhe_ecdsa_rc4_128_sha |
+ TLS_ECDHE_ECDSA_WITH_RC4_128_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdhe_ecdsa_3des_sha |
+ TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdhe_ecdsa_aes_128_sha |
+ TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdhe_ecdsa_aes_256_sha |
+ TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_rsa_null_sha |
+ TLS_ECDH_RSA_WITH_NULL_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_rsa_128_sha |
+ TLS_ECDH_RSA_WITH_RC4_128_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_rsa_3des_sha |
+ TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_rsa_aes_128_sha |
+ TLS_ECDH_RSA_WITH_AES_128_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_rsa_aes_256_sha |
+ TLS_ECDH_RSA_WITH_AES_256_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ echde_rsa_null |
+ TLS_ECDHE_RSA_WITH_NULL_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdhe_rsa_rc4_128_sha |
+ TLS_ECDHE_RSA_WITH_RC4_128_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdhe_rsa_3des_sha |
+ TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdhe_rsa_aes_128_sha |
+ TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdhe_rsa_aes_256_sha |
+ TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_anon_null_sha |
+ TLS_ECDH_anon_WITH_NULL_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_anon_rc4_128sha |
+ TLS_ECDH_anon_WITH_RC4_128_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_anon_3des_sha |
+ TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_anon_aes_128_sha |
+ TLS_ECDH_anon_WITH_AES_128_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+ ecdh_anon_aes_256_sha |
+ TLS_ECDH_anon_WITH_AES_256_CBC_SHA |
+- TLSv1 |
++ TLSv1.0/TLSv1.1/TLSv1.2 |
+
+
+
+@@ -839,16 +839,36 @@ specifically but allows ciphers for that
+ Options are:
+
+ SSLv3
+- TLSv1
++ TLSv1 (legacy only; replaced by TLSv1.0)
++ TLSv1.0
++ TLSv1.1
++ TLSv1.2
+ All
+
+ Note that this differs from mod_ssl in that you can't add or subtract
+ protocols.
++
++If no NSSProtocol is specified, mod_nss will default to allowing the use of
++the SSLv3, TLSv1.0, TLSv1.1, and TLSv1.2 protocols, where SSLv3 will be set to be the
++minimum protocol allowed, and TLSv1.2 will be set to be the maximum protocol
++allowed.
++
++If values for NSSProtocol are specified, mod_nss will set both the minimum
++and the maximum allowed protocols based upon these entries allowing for the
++inclusion of every protocol in-between. For example, if only SSLv3 and TLSv1.2
++are specified, SSLv3, TLSv1.0, TLSv1.1 and TLSv1.2 will all be allowed, as NSS utilizes
++protocol ranges to accept all protocols inclusively
++(TLS 1.2 ->TLS 1.1 -> TLS 1.0 -> SSL 3.0), and does not allow exclusion of any protocols
++in the middle of a range (e. g. - TLS 1.0).
++
++Finally, NSS will always automatically negotiate the use of the strongest
++possible protocol that has been specified which is acceptable to both sides of
++a given connection.
+ SSLv2 is not supported by default at this time.
+
+ Example
+
+-NSSProtocol SSLv3,TLSv1
++NSSProtocol SSLv3,TLSv1.0,TLSv1.1,TLSv1.2
+
+ NSSNickname
+
+@@ -1101,7 +1121,7 @@ was compiled against.
+
+ SSL_PROTOCOL
+ |
+- SSLv2, SSLv3 or TLSv1
++ | SSLv2, SSLv3, TLSv1.0, TLSv1.1, or TLSv1.2
+ |
+
+
+@@ -1443,7 +1463,7 @@ Opera, and
+ Safari) support SSL 3 and TLS so there is no need for a web server to
+ support
+ SSL 2. There are some known attacks against SSL 2 that are handled by
+-SSL 3/TLS. SSL2 also doesn't support useful features like client
++SSL 3/TLS. SSLv2 also doesn't support useful features like client
+ authentication.
+
+ Frequently Asked Questions
+Index: mod_nss-1.0.8/mod_nss.c
+===================================================================
+--- mod_nss-1.0.8.orig/mod_nss.c
++++ mod_nss-1.0.8/mod_nss.c
+@@ -90,7 +90,7 @@ static const command_rec nss_config_cmds
+ "(`[+-]XXX,...,[+-]XXX' - see manual)")
+ SSL_CMD_SRV(Protocol, RAW_ARGS,
+ "Enable the various SSL protocols"
+- "(`[SSLv2|SSLv3|TLSv1|all] ...' - see manual)")
++ "(`[SSLv2|SSLv3|TLSv1.0|TLSv1.1|TLSv1.2|all] ...' - see manual)")
+ SSL_CMD_ALL(VerifyClient, TAKE1,
+ "SSL Client Authentication "
+ "(`none', `optional', `require'")
+@@ -135,7 +135,7 @@ static const command_rec nss_config_cmds
+ "(`on', `off')")
+ SSL_CMD_SRV(ProxyProtocol, RAW_ARGS,
+ "SSL Proxy: enable or disable SSL protocol flavors "
+- "(`[+-][SSLv2|SSLv3|TLSv1] ...' - see manual)")
++ "(`[+-][SSLv2|SSLv3|TLSv1.0|TLSv1.1|TLSv1.2] ...' - see manual)")
+ SSL_CMD_SRV(ProxyCipherSuite, TAKE1,
+ "SSL Proxy: colon-delimited list of permitted SSL ciphers "
+ "(`XXX:...:XXX' - see manual)")
+Index: mod_nss-1.0.8/nss.conf.in
+===================================================================
+--- mod_nss-1.0.8.orig/nss.conf.in
++++ mod_nss-1.0.8/nss.conf.in
+@@ -111,7 +111,16 @@ NSSCipherSuite +rsa_rc4_128_md5,+rsa_rc4
+ # ECC enabled NSS and mod_nss and want to use Elliptical Curve Cryptography
+ #NSSCipherSuite +rsa_rc4_128_md5,+rsa_rc4_128_sha,+rsa_3des_sha,-rsa_des_sha,-rsa_rc4_40_md5,-rsa_rc2_40_md5,-rsa_null_md5,-rsa_null_sha,+fips_3des_sha,-fips_des_sha,-fortezza,-fortezza_rc4_128_sha,-fortezza_null,-rsa_des_56_sha,-rsa_rc4_56_sha,+rsa_aes_128_sha,+rsa_aes_256_sha,-ecdh_ecdsa_null_sha,+ecdh_ecdsa_rc4_128_sha,+ecdh_ecdsa_3des_sha,+ecdh_ecdsa_aes_128_sha,+ecdh_ecdsa_aes_256_sha,-ecdhe_ecdsa_null_sha,+ecdhe_ecdsa_rc4_128_sha,+ecdhe_ecdsa_3des_sha,+ecdhe_ecdsa_aes_128_sha,+ecdhe_ecdsa_aes_256_sha,-ecdh_rsa_null_sha,+ecdh_rsa_128_sha,+ecdh_rsa_3des_sha,+ecdh_rsa_aes_128_sha,+ecdh_rsa_aes_256_sha,-echde_rsa_null,+ecdhe_rsa_rc4_128_sha,+ecdhe_rsa_3des_sha,+ecdhe_rsa_aes_128_sha,+ecdhe_rsa_aes_256_sha
+
+-NSSProtocol SSLv3,TLSv1
++# SSL Protocol:
++# Cryptographic protocols that provide communication security.
++# NSS handles the specified protocols as "ranges", and automatically
++# negotiates the use of the strongest protocol for a connection starting
++# with the maximum specified protocol and downgrading as necessary to the
++# minimum specified protocol that can be used between two processes.
++# Since all protocol ranges are completely inclusive, and no protocol in the
++# middle of a range may be excluded, the entry "NSSProtocol SSLv3,TLSv1.1"
++# is identical to the entry "NSSProtocol SSLv3,TLSv1.0,TLSv1.1".
++NSSProtocol SSLv3,TLSv1.0,TLSv1.1
+
+ # SSL Certificate Nickname:
+ # The nickname of the RSA server certificate you are going to use.
+Index: mod_nss-1.0.8/nss_engine_init.c
+===================================================================
+--- mod_nss-1.0.8.orig/nss_engine_init.c
++++ mod_nss-1.0.8/nss_engine_init.c
+@@ -610,62 +610,103 @@ static void nss_init_ctx_protocol(server
+ apr_pool_t *ptemp,
+ modnss_ctx_t *mctx)
+ {
+- int ssl2, ssl3, tls;
++ int ssl2, ssl3, tls, tls1_1, tls1_2;
++ char *protocol_marker = NULL;
+ char *lprotocols = NULL;
+ SECStatus stat;
++ SSLVersionRange enabledVersions;
+
+- ssl2 = ssl3 = tls = 0;
++ ssl2 = ssl3 = tls = tls1_1 = tls1_2 = 0;
++
++ /*
++ * Since this routine will be invoked individually for every thread
++ * associated with each 'server' object as well as for every thread
++ * associated with each 'proxy' object, identify the protocol marker
++ * ('NSSProtocol' for 'server' versus 'NSSProxyProtocol' for 'proxy')
++ * via each thread's object type and apply this useful information to
++ * all log messages.
++ */
++ if (mctx == mctx->sc->server) {
++ protocol_marker = "NSSProtocol";
++ } else if (mctx == mctx->sc->proxy) {
++ protocol_marker = "NSSProxyProtocol";
++ }
+
+ if (mctx->sc->fips) {
+ ap_log_error(APLOG_MARK, APLOG_INFO, 0, s,
+- "In FIPS mode, enabling TLSv1");
+- tls = 1;
++ "In FIPS mode ignoring %s list, enabling TLSv1.0, TLSv1.1 and TLSv1.2",
++ protocol_marker);
++ tls = tls1_1 = tls1_2 = 1;
+ } else {
+ if (mctx->auth.protocols == NULL) {
+- /*
+- * Since this routine will be invoked individually for every
+- * thread associated with each 'server' object as well as for
+- * every thread associated with each 'proxy' object, issue a
+- * single per-thread 'warning' message for either a 'server'
+- * or a 'proxy' based upon the thread's object type.
+- */
+- if (mctx == mctx->sc->server) {
+- ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
+- "NSSProtocol value not set; using: SSLv3 and TLSv1");
+- } else if (mctx == mctx->sc->proxy) {
+- ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
+- "NSSProxyProtocol value not set; using: SSLv3 and TLSv1");
+- }
++ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
++ "%s value not set; using: SSLv3, TLSv1.0, TLSv1.1 and TLSv1.2",
++ protocol_marker);
+
+- ssl3 = tls = 1;
++ ssl3 = tls = tls1_1 = tls1_2 = 1;
+ } else {
+ lprotocols = strdup(mctx->auth.protocols);
+ ap_str_tolower(lprotocols);
+
+ if (strstr(lprotocols, "all") != NULL) {
+ #ifdef WANT_SSL2
+- ssl2 = ssl3 = tls = 1;
++ ssl2 = ssl3 = tls = tls1_1= tls1_2 = 1;
+ #else
+- ssl3 = tls = 1;
++ ssl3 = tls = tls1_1 = tls1_2 = 1;
+ #endif
+ } else {
+- if (strstr(lprotocols, "sslv2") != NULL) {
++ char *protocol_list = NULL;
++ char *saveptr = NULL;
++ char *token = NULL;
++
++ for (protocol_list = lprotocols; ; protocol_list = NULL) {
++ token = strtok_r(protocol_list, ",", &saveptr);
++ if (token == NULL) {
++ break;
++ } else if (strcmp(token, "sslv2") == 0) {
+ #ifdef WANT_SSL2
+- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "Enabling SSL2");
+- ssl2 = 1;
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: Enabling SSL2",
++ protocol_marker);
++ ssl2 = 1;
+ #else
+- ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, "SSL2 is not supported");
++ ap_log_error(APLOG_MARK, APLOG_INFO, 0, s,
++ "%s: SSL2 is not supported",
++ protocol_marker);
+ #endif
+- }
+-
+- if (strstr(lprotocols, "sslv3") != NULL) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "Enabling SSL3");
+- ssl3 = 1;
+- }
+-
+- if (strstr(lprotocols, "tlsv1") != NULL) {
+- ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, "Enabling TLS");
+- tls = 1;
++ } else if (strcmp(token, "sslv3") == 0) {
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: Enabling SSL3",
++ protocol_marker);
++ ssl3 = 1;
++ } else if (strcmp(token, "tlsv1") == 0) {
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: Enabling TLSv1.0 via TLSv1",
++ protocol_marker);
++ ap_log_error(APLOG_MARK, APLOG_INFO, 0, s,
++ "%s: The 'TLSv1' protocol name has been deprecated; please change 'TLSv1' to 'TLSv1.0'.",
++ protocol_marker);
++ tls = 1;
++ } else if (strcmp(token, "tlsv1.0") == 0) {
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: Enabling TLSv1.0",
++ protocol_marker);
++ tls = 1;
++ } else if (strcmp(token, "tlsv1.1") == 0) {
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: Enabling TLSv1.1",
++ protocol_marker);
++ tls1_1 = 1;
++ } else if (strcmp(token, "tlsv1.2") == 0) {
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: Enabling TLSv1.2",
++ protocol_marker);
++ tls1_2 = 1;
++ } else {
++ ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
++ "%s: Unknown protocol '%s' not supported",
++ protocol_marker, token);
++ }
+ }
+ }
+ free(lprotocols);
+@@ -680,31 +721,110 @@ static void nss_init_ctx_protocol(server
+ stat = SSL_OptionSet(mctx->model, SSL_ENABLE_SSL2, PR_FALSE);
+ }
+
++ /* Set protocol version ranges:
++ *
++ * (1) Set the minimum protocol accepted
++ * (2) Set the maximum protocol accepted
++ * (3) Protocol ranges extend from maximum down to minimum protocol
++ * (4) All protocol ranges are completely inclusive;
++ * no protocol in the middle of a range may be excluded
++ * (5) NSS automatically negotiates the use of the strongest protocol
++ * for a connection starting with the maximum specified protocol
++ * and downgrading as necessary to the minimum specified protocol
++ *
++ * For example, if SSL 3.0 is chosen as the minimum protocol, and
++ * TLS 1.1 is chosen as the maximum protocol, SSL 3.0, TLS 1.0, and
++ * TLS 1.1 will all be accepted as protocols, as TLS 1.0 will not and
++ * cannot be excluded from this range. NSS will automatically negotiate
++ * to utilize the strongest acceptable protocol for a connection starting
++ * with the maximum specified protocol and downgrading as necessary to the
++ * minimum specified protocol (TLS 1.1 -> TLS 1.0 -> SSL 3.0).
++ */
+ if (stat == SECSuccess) {
++ /* Set minimum protocol version (lowest -> highest)
++ *
++ * SSL 3.0 -> TLS 1.0 -> TLS 1.1
++ */
+ if (ssl3 == 1) {
+- stat = SSL_OptionSet(mctx->model, SSL_ENABLE_SSL3, PR_TRUE);
++ enabledVersions.min = SSL_LIBRARY_VERSION_3_0;
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: [SSL 3.0] (minimum)",
++ protocol_marker);
++ } else if (tls == 1) {
++ enabledVersions.min = SSL_LIBRARY_VERSION_TLS_1_0;
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: [TLS 1.0] (minimum)",
++ protocol_marker);
++ } else if (tls1_1 == 1) {
++ enabledVersions.min = SSL_LIBRARY_VERSION_TLS_1_1;
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: [TLS 1.1] (minimum)",
++ protocol_marker);
++ } else if (tls1_2 == 1) {
++ enabledVersions.min = SSL_LIBRARY_VERSION_TLS_1_2;
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: [TLS 1.2] (minimum)",
++ protocol_marker);
+ } else {
+- stat = SSL_OptionSet(mctx->model, SSL_ENABLE_SSL3, PR_FALSE);
++ /* Set default minimum protocol version to SSL 3.0 */
++ enabledVersions.min = SSL_LIBRARY_VERSION_3_0;
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: [SSL 3.0] (default minimum)",
++ protocol_marker);
+ }
+- }
+- if (stat == SECSuccess) {
+- if (tls == 1) {
+- stat = SSL_OptionSet(mctx->model, SSL_ENABLE_TLS, PR_TRUE);
++
++ /* Set maximum protocol version (highest -> lowest)
++ *
++ * TLS 1.2 -> TLS 1.1 -> TLS 1.0 -> SSL 3.0
++ */
++ if (tls1_2 == 1) {
++ enabledVersions.max = SSL_LIBRARY_VERSION_TLS_1_2;
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: [TLS 1.2] (maximum)",
++ protocol_marker);
++ } else if (tls1_1 == 1) {
++ enabledVersions.max = SSL_LIBRARY_VERSION_TLS_1_1;
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: [TLS 1.1] (maximum)",
++ protocol_marker);
++ } else if (tls == 1) {
++ enabledVersions.max = SSL_LIBRARY_VERSION_TLS_1_0;
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: [TLS 1.0] (maximum)",
++ protocol_marker);
++ } else if (ssl3 == 1) {
++ enabledVersions.max = SSL_LIBRARY_VERSION_3_0;
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: [SSL 3.0] (maximum)",
++ protocol_marker);
+ } else {
+- stat = SSL_OptionSet(mctx->model, SSL_ENABLE_TLS, PR_FALSE);
++ /* Set default maximum protocol version to TLS 1.2 */
++ enabledVersions.max = SSL_LIBRARY_VERSION_TLS_1_2;
++ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
++ "%s: [TLS 1.2] (default maximum)",
++ protocol_marker);
+ }
++
++ stat = SSL_VersionRangeSet(mctx->model, &enabledVersions);
+ }
+
+ if (stat != SECSuccess) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+- "SSL protocol initialization failed.");
++ "%s: SSL/TLS protocol initialization failed.",
++ protocol_marker);
+ nss_log_nss_error(APLOG_MARK, APLOG_ERR, s);
+ nss_die();
+ }
+
+ mctx->ssl2 = ssl2;
+ mctx->ssl3 = ssl3;
+- mctx->tls = tls;
++ if (tls1_2 == 1) {
++ mctx->tls = tls1_2;
++ } else if (tls1_1 == 1) {
++ mctx->tls = tls1_1;
++ } else {
++ mctx->tls = tls;
++ }
+ }
+
+ static void nss_init_ctx_session_cache(server_rec *s,
+@@ -785,6 +905,8 @@ static void nss_init_ctx_cipher_suite(se
+ PRBool cipher_state[ciphernum];
+ PRBool fips_state[ciphernum];
+ const char *suite = mctx->auth.cipher_suite;
++ char * object_type = NULL;
++ char * cipher_suite_marker = NULL;
+ char * ciphers;
+ char * fipsciphers = NULL;
+ int i;
+@@ -814,6 +936,23 @@ static void nss_init_ctx_cipher_suite(se
+
+ nss_die();
+ }
++
++ /*
++ * Since this routine will be invoked individually for every thread
++ * associated with each 'server' object as well as for every thread
++ * associated with each 'proxy' object, identify the cipher suite markers
++ * ('NSSCipherSuite' for 'server' versus 'NSSProxyCipherSuite' for 'proxy')
++ * via each thread's object type and apply this useful information to
++ * all log messages.
++ */
++ if (mctx == mctx->sc->server) {
++ object_type = "server";
++ cipher_suite_marker = "NSSCipherSuite";
++ } else if (mctx == mctx->sc->proxy) {
++ object_type = "proxy";
++ cipher_suite_marker = "NSSProxyCipherSuite";
++ }
++
+ ciphers = strdup(suite);
+
+ #define CIPHERSIZE 2048
+@@ -848,13 +987,13 @@ static void nss_init_ctx_cipher_suite(se
+ }
+
+ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
+- "FIPS mode enabled, permitted SSL ciphers are: [%s]",
+- fipsciphers);
++ "FIPS mode enabled on this %s, permitted SSL ciphers are: [%s]",
++ object_type, fipsciphers);
+ }
+
+ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
+- "Configuring permitted SSL ciphers [%s]",
+- suite);
++ "%s: Configuring permitted SSL ciphers [%s]",
++ cipher_suite_marker, suite);
+
+ /* Disable all NSS supported cipher suites. This is to prevent any new
+ * NSS cipher suites from getting automatically and unintentionally
+@@ -893,7 +1032,7 @@ static void nss_init_ctx_cipher_suite(se
+ for (i=0; issl2 && countciphers(cipher_state, SSL2) == 0) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+- "SSL2 is enabled but no SSL2 ciphers are enabled.");
++ "%s: SSL2 is enabled but no SSL2 ciphers are enabled.",
++ cipher_suite_marker);
+ nss_die();
+ }
+
+ if (mctx->ssl3 && countciphers(cipher_state, SSL3) == 0) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+- "SSL3 is enabled but no SSL3 ciphers are enabled.");
++ "%s: SSL3 is enabled but no SSL3 ciphers are enabled.",
++ cipher_suite_marker);
+ nss_die();
+ }
+
+ if (mctx->tls && countciphers(cipher_state, TLS) == 0) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, s,
+- "TLS is enabled but no TLS ciphers are enabled.");
++ "%s: TLS is enabled but no TLS ciphers are enabled.",
++ cipher_suite_marker);
+ nss_die();
+ }
+
+Index: mod_nss-1.0.8/nss_engine_vars.c
+===================================================================
+--- mod_nss-1.0.8.orig/nss_engine_vars.c
++++ mod_nss-1.0.8/nss_engine_vars.c
+@@ -722,9 +722,13 @@ static char *nss_var_lookup_protocol_ver
+ case SSL_LIBRARY_VERSION_3_0:
+ result = "SSLv3";
+ break;
+- case SSL_LIBRARY_VERSION_3_1_TLS:
++ case SSL_LIBRARY_VERSION_TLS_1_0:
++ /* 'TLSv1' has been deprecated; specify 'TLSv1.0' */
+ result = "TLSv1";
+ break;
++ case SSL_LIBRARY_VERSION_TLS_1_1:
++ result = "TLSv1.1";
++ break;
+ }
+ }
+ }