Hi,

> $ openssl s_client -state -quiet -connect xx.xx.xx.xx:443
>
> SSL_connect:before/connect initialization
> SSL_connect:SSLv2/v3 write client hello A
> SSL_connect:SSLv3 read server hello A
> depth=4 /C=NL/O=xxx/CN=xxx
> verify error:num=19:self signed certificate in certificate chain
> verify return:0
> SSL_connect:SSLv3 read server certificate A
> SSL_connect:SSLv3 read server key exchange A
> SSL_connect:SSLv3 read server done A
> SSL_connect:SSLv3 write client key exchange A
> SSL_connect:SSLv3 write change cipher spec A
> SSL_connect:SSLv3 write finished A
> SSL_connect:SSLv3 flush data
> SSL_connect:SSLv3 read finished A
> GET /admin/ HTTP/1.0
>
> SSL_connect:SSL renegotiate ciphers
> SSL_connect:SSLv3 write client hello A
> SSL_connect:SSLv3 read server hello A
> depth=4 /C=NL/O=xxx/CN=xxx
> verify error:num=19:self signed certificate in certificate chain
> verify return:0
> SSL_connect:SSLv3 read server certificate A
> SSL_connect:SSLv3 read server key exchange A
> SSL_connect:SSLv3 read server certificate request A
> SSL_connect:SSLv3 read server done A
> SSL_connect:SSLv3 write client certificate A
> SSL_connect:SSLv3 write client key exchange A
> SSL_connect:SSLv3 write change cipher spec A
> SSL_connect:SSLv3 write finished A
> SSL_connect:SSLv3 flush data
> SSL3 alert read:fatal:handshake failure

Ok, its clear what Apache is doing. After matching the /admin/ path,
Apache triggers a SSL renegotiation and within that renegotiation requests
the client certificate from the browser.

Because this all happens with a renegotiation, this is probably valid
behavior from a SSL/TLS perspective.

It is still a layering violation imho, because we trigger layer 5
renegotiation by matching a layer 7 event and I would rather avoid that.



> In the testing phase (now), some clients have issues with the app
> (because they have a certificate in their browser). On Apache/F5 they
> are not asked for a certificate in using the app, only admins are.

I understand this now; your actual customers are seeing this, if they
have at least 1 client certificate in the browser, even though they
don't use, care and know about the /admin/ path, which you are only
using internally.

I see why this sucks.



> If it is not possible to do this with haproxy (because it is invalid
> according to the spec) then I'll probably suggest they move the admin
> interface out of the user-facing part of the app.

Yes, I suggest you do this. You will need to do this with a second bind
statement, which means either moving it to a different port or to a
different IP address.

What would make sense in HAproxy however is the possibility to set the
verify command based on SNI values and I think there are some very valid
use cases that could benefit from it (SNI based virtual hosting with
different client-cert settings or like in your case a dedicated admin
interface).

We already have a snifilter for crt-list [1], extending "verify" with a
snifilter is probably doable.



Regards,

Lukas


[1] http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#5.1-crt-list   
                                  

Reply via email to