Package: apache2
Version: 2.4.10-10+deb8u4
Severity: normal
Tags: patch

Dear Maintainers,

After migrating from Wheezy to Jessie we found out that the connections from
the apache frontend to some https backends was broken.  After investigating
this we found out that this was happening on virtualhosts with
ProxyPreserveHost set to On, which means, with a setup like this:

ProxyPreserveHost On
SSLProxyEngine on
SSLProxyCACertificateFile /etc/ssl/certs/ca-certificates.crt
SSLProxyCheckPeerCN on
SSLProxyCheckPeerName on
SSLProxyCheckPeerExpire on
SSLProxyVerify require
SSlProxyVerifyDepth 2
ProxyPass / https://internal.website.com/

These virtualhosts were working perfectly on apache 2.2 under wheezy but
stopped working under apache 2.4.10 on jessie (I have tested 2.4.18 with the
same results).

The problem is that when ProxyPreserveHost is On apache proxy sets the SSL
name to that of the original Host and thus it expects to find a certificate
with that name, not the one you specify on your proxy url, while the
backends really have their own certificate for their own name, thus it can't
verify the certificate and the connection is not done.

I have mailed about this to the httpd-users mailing list without any reply:
http://mail-archives.apache.org/mod_mbox/httpd-users/201511.mbox/%3c20151106144412.ga8...@www.manty.net%3E

Looking at the code changes in 2.4 I have found that the funcion
ap_proxy_determine_connection is the one that is now setting ssl_hostname
defined on mod_proxy.h as:
    const char   *ssl_hostname;/* Hostname (SNI) in use by SSL connection */
to the value of the original host request which to me is not what you want
when you are making a secure connection to another host, not even if you
have ProxyPreserveHost set.

These are patches to restore the old behaviour that we used to have on 2.2
both for stable and unstable versions:

--- apache2-2.4.10.orig/modules/proxy/proxy_util.c
+++ apache2-2.4.10/modules/proxy/proxy_util.c
@@ -2361,12 +2361,12 @@ ap_proxy_determine_connection(apr_pool_t
          * backend request URI.
          */
         dconf = ap_get_module_config(r->per_dir_config, &proxy_module);
-        if (dconf->preserve_host) {
-            ssl_hostname = r->hostname;
-        }
-        else {
+//        if (dconf->preserve_host) {
+//            ssl_hostname = r->hostname;
+//        }
+//        else {
             ssl_hostname = conn->hostname;
-        }
+//        }
         /*
          * Close if a SNI is in use but this request requires no or
          * a different one, or no SNI is in use but one is required.

--- apache2-2.4.18.orig/modules/proxy/proxy_util.c
+++ apache2-2.4.18/modules/proxy/proxy_util.c
@@ -2394,10 +2394,11 @@ ap_proxy_determine_connection(apr_pool_t
          * backend request URI.
          */
         dconf = ap_get_module_config(r->per_dir_config, &proxy_module);
-        if (dconf->preserve_host) {
-            ssl_hostname = r->hostname;
-        }
-        else if (conn->forward
+//        if (dconf->preserve_host) {
+//            ssl_hostname = r->hostname;
+//        }
+//        else
+        if (conn->forward
                  && ((forward_info *)(conn->forward))->use_http_connect) {
             ssl_hostname = ((forward_info *)conn->forward)->target_host;
         }

I haven't found any Apache doc commenting anything on this behaviour change,
however I have found mails from people that have also found this problem and
that were disabling the ssl checks so that apache would make the connections
to the backend anyway, I consider this a bug and I think we should go back
to the old behaviour, if the old behaviour is no longer considered Ok by
apache I suggest that a new option is added to select weather we want the
new or the old behaviour.

If anything is not clear please ask.

Thanks in advance.

-- Package-specific info:

-- System Information:
Debian Release: 8.3
  APT prefers stable
  APT policy: (990, 'stable'), (500, 'stable-updates'), (500, 'unstable'), 
(500, 'testing'), (500, 'oldstable'), (101, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 3.16.0-4-amd64 (SMP w/4 CPU cores)
Locale: LANG=gl_ES.UTF-8, LC_CTYPE=gl_ES.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/bash
Init: sysvinit (via /sbin/init)

Versions of packages apache2 depends on:
ii  apache2-bin    2.4.10-10+deb8u4
ii  apache2-data   2.4.10-10+deb8u4
ii  apache2-utils  2.4.10-10+deb8u4
ii  dpkg           1.17.26
ii  lsb-base       4.1+Debian13+nmu1
ii  mime-support   3.58
ii  perl           5.20.2-3+deb8u3
ii  procps         2:3.3.9-9

Versions of packages apache2 recommends:
ii  ssl-cert  1.0.35

Versions of packages apache2 suggests:
pn  apache2-doc                                      <none>
pn  apache2-suexec-pristine | apache2-suexec-custom  <none>
ii  chromium [www-browser]                           48.0.2564.82-1~deb8u1
ii  google-chrome-stable [www-browser]               47.0.2526.111-1
ii  iceweasel [www-browser]                          38.6.0esr-1~deb8u1
ii  links [www-browser]                              2.8-2+b3
ii  lynx-cur [www-browser]                           2.8.9dev1-2+deb8u1
ii  midori [www-browser]                             0.5.11-ds1-2
ii  w3m [www-browser]                                0.5.3-19

Versions of packages apache2-bin depends on:
ii  libapr1                  1.5.1-3
ii  libaprutil1              1.5.4-1
ii  libaprutil1-dbd-sqlite3  1.5.4-1
ii  libaprutil1-ldap         1.5.4-1
ii  libc6                    2.19-18+deb8u2
ii  libldap-2.4-2            2.4.40+dfsg-1+deb8u2
ii  liblua5.1-0              5.1.5-7.1
ii  libpcre3                 2:8.35-3.3+deb8u2
ii  libssl1.0.0              1.0.1k-3+deb8u2
ii  libxml2                  2.9.1+dfsg1-5+deb8u1
ii  perl                     5.20.2-3+deb8u3
ii  zlib1g                   1:1.2.8.dfsg-2+b1

Versions of packages apache2-bin suggests:
pn  apache2-doc                                      <none>
pn  apache2-suexec-pristine | apache2-suexec-custom  <none>
ii  chromium [www-browser]                           48.0.2564.82-1~deb8u1
ii  google-chrome-stable [www-browser]               47.0.2526.111-1
ii  iceweasel [www-browser]                          38.6.0esr-1~deb8u1
ii  links [www-browser]                              2.8-2+b3
ii  lynx-cur [www-browser]                           2.8.9dev1-2+deb8u1
ii  midori [www-browser]                             0.5.11-ds1-2
ii  w3m [www-browser]                                0.5.3-19

Versions of packages apache2 is related to:
ii  apache2      2.4.10-10+deb8u4
ii  apache2-bin  2.4.10-10+deb8u4

-- Configuration Files:
/etc/apache2/mods-available/http2.load e18e0c7e38196e7d7580ecedaaa72e3b [Errno 
2] Non hai tal ficheiro ou directorio: u'/etc/apache2/mods-available/http2.load 
e18e0c7e38196e7d7580ecedaaa72e3b'
/etc/apache2/mods-available/proxy_html.conf 5b60af3b1796f2db4b5f7a8a7941f1bc 
[Errno 2] Non hai tal ficheiro ou directorio: 
u'/etc/apache2/mods-available/proxy_html.conf 5b60af3b1796f2db4b5f7a8a7941f1bc'
/etc/apache2/sites-available/000-default.conf changed [not included]

-- no debconf information

Reply via email to