From 689d981541a4805760acd6a2ba1433dc3d3534b1 Mon Sep 17 00:00:00 2001 From: William Lallemand Date: Fri, 6 Nov 2020 16:24:07 +0100 Subject: [PATCH] BUG/MEDIUM: ssl/crt-list: correctly insert crt-list line if crt already loaded In issue #940, it was reported that the crt-list does not work correctly anymore. Indeed when inserting a crt-list line which use a certificate previously seen in the crt-list, this one won't be inserted in the SNI list and will be silently ignored. This bug was introduced by commit 47da821 "MEDIUM: ssl: emulates the multi-cert bundles in the crtlist". This patch also includes a reg-test which tests this issue. This bugfix must be backported in 2.3. (cherry picked from commit 50c03aac0417f7d70f98f31e513441c0fb743110) Signed-off-by: William Lallemand --- reg-tests/ssl/simple.crt-list | 5 ++++ reg-tests/ssl/ssl_simple_crt-list.vtc | 51 +++++++++++++++++++++++++++++++++ src/ssl_crtlist.c | 6 ++++ 3 files changed, 62 insertions(+) create mode 100644 reg-tests/ssl/simple.crt-list create mode 100644 reg-tests/ssl/ssl_simple_crt-list.vtc diff --git a/reg-tests/ssl/simple.crt-list b/reg-tests/ssl/simple.crt-list new file mode 100644 index 0000000..9ffacb4 --- /dev/null +++ b/reg-tests/ssl/simple.crt-list @@ -0,0 +1,5 @@ +common.pem record1.bug940.domain.tld +common.pem record2.bug940.domain.tld +ecdsa.pem record3.bug940.domain.tld +ecdsa.pem record4.bug940.domain.tld + diff --git a/reg-tests/ssl/ssl_simple_crt-list.vtc b/reg-tests/ssl/ssl_simple_crt-list.vtc new file mode 100644 index 0000000..76605e3 --- /dev/null +++ b/reg-tests/ssl/ssl_simple_crt-list.vtc @@ -0,0 +1,51 @@ +#REGTEST_TYPE=bug +varnishtest "Test for the bug #940" +# Test that the SNI are correcly inserted with the same file multiple times. + +#REQUIRE_VERSION=2.2 +#REQUIRE_OPTIONS=OPENSSL +feature ignore_unknown_macro + +server s1 -repeat 4 { + rxreq + txresp +} -start + +haproxy h1 -conf { + global + tune.ssl.default-dh-param 2048 + crt-base ${testdir} + stats socket "${tmpdir}/h1/stats" level admin + + defaults + mode http + option httplog + log stderr local0 debug err + option logasap + timeout connect 1s + timeout client 1s + timeout server 1s + + + listen clear-lst + bind "fd@${clearlst}" + balance roundrobin + server s1 "${tmpdir}/ssl.sock" ssl verify none sni str(record1.bug940.domain.tld) + server s2 "${tmpdir}/ssl.sock" ssl verify none sni str(record2.bug940.domain.tld) + server s3 "${tmpdir}/ssl.sock" ssl verify none sni str(record3.bug940.domain.tld) + server s4 "${tmpdir}/ssl.sock" ssl verify none sni str(record4.bug940.domain.tld) + + listen ssl-lst + mode http + ${no-htx} option http-use-htx + bind "${tmpdir}/ssl.sock" ssl strict-sni crt-list ${testdir}/simple.crt-list + + server s1 ${s1_addr}:${s1_port} +} -start + + +client c1 -repeat 4 -connect ${h1_clearlst_sock} { + txreq + rxresp + expect resp.status == 200 +} -run diff --git a/src/ssl_crtlist.c b/src/ssl_crtlist.c index 65ca289..5f5942b 100644 --- a/src/ssl_crtlist.c +++ b/src/ssl_crtlist.c @@ -598,6 +598,12 @@ int crtlist_parse_file(char *file, struct bind_conf *bind_conf, struct proxy *cu } } } + } else { + entry->node.key = ckchs; + entry->crtlist = newlist; + ebpt_insert(&newlist->entries, &entry->node); + LIST_ADDQ(&newlist->ord_entries, &entry->by_crtlist); + LIST_ADDQ(&ckchs->crtlist_entry, &entry->by_ckch_store); } entry = NULL; } -- 1.7.10.4