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.
This commit is contained in:
William Lallemand 2020-11-06 16:24:07 +01:00 committed by William Lallemand
parent 3ff9591ea2
commit 50c03aac04
3 changed files with 62 additions and 0 deletions

View File

@ -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

View File

@ -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

View File

@ -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;
}