​I looked a little bit deeper into this and found that this looks
like a missing implementation in mod_proxy_wstunnel.

The proxy_wstunnel_handler() (in modules/proxy/mod_proxy_wstunnel.c)
does not set the "proxy-request-hostname" when it creates the
connection to the backend. When the TLS handshake is done then
(in ssl_io_filter_handshake() (in modules/ssl/ssl_engine_io.c))
this causes the check to be omitted.

Looking into the HTTP Proxy implementation proxy_http_handler()
(of module/proxy/mod_proxy_http.c) sets this.

So I filed a bug that describes the issue in detail and proposes
a fix (which I already tested sucessfully):

Defect summary:
    Security: Apache 2.4 not verifying URL hostname against certificate
    in SSL handshake for WebSockets
Reference:
    https://bz.apache.org/bugzilla/show_bug.cgi?id=61857​


2017-12-04 17:04 GMT+01:00 Markus Gausling <markusgausl...@googlemail.com>:

> ​Hello,
>
> I am using Apache as a "WebSocket Relay" that allows local clients to
> connect to local ​Apache using "ws://" and Apache then maps this to
> "wss://" and passes the request on to the actual serving backend.
>
> I have defined a Virtual Host for this:
>     <VirtualHost 127.0.0.1:8888>
>         SSLProxyEngine On
>         ProxyRequests Off
>
>         <Proxy "*">
>             Order deny,allow
>             Deny from all
>             Allow from 127.0.0.1
>         </Proxy>
>
>         ProxyPass /websocket/ wss://mywebsocket.org/
>     </VirtualHost>
>
> So a local request to Apache for ws://​127.0.0.1:8888/​websocket/would
> end up in a request to wss://mywebsocket.org/.
>
> I have also defined the following security option (amongst others):
>     SSLProxyCheckPeerCN on
>     SSLProxyCheckPeerName on
>     SSLProxyCheckPeerExpire on
>     SSLProxyCACertificateFile "/opt/apache2/mycert.pem"
>     SSLProxyVerify require
>     SSLProxyVerifyDepth 1
>
> While Apache properly checks if the server provided certificate is
> not expired and also matches mycert.pem it does not validate the
> subject name or the subject alternative names.
>
> This means when I map the IP address of mywebsocket.org in /etc/hosts,
> to e.g. to myotherwebsocket.org, then Apache establishes a secure
> connection
> to mywebsocket.org however it does not complain about the mismatch
> of the hostname in the request ("myotherwebsocket.org") vs. the one in
> the certificate provided during TLS session establishment ("
> mywebsocket.org").
>
> When I do the similar thing for HTTP (define Reverse Proxy which does
> http-to-https mapping) then Apache corectly refuses the connection as
>
> it realizes that name in certificate provided by server and hostname in
>
> request URL do not match.
>
> Is this a known issue/unimplemented feature or am I missing some
> specific configuration here?
>
> Regards
> Markus
>

Reply via email to