mirror of
https://git.haproxy.org/git/haproxy.git/
synced 2025-09-21 05:41:26 +02:00
BUG/MEDIUM: ssl/cli: crash when crt inserted into a crt-list
The crash occures when the same certificate which is used on both a server line and a bind line is inserted in a crt-list over the CLI. This is quite uncommon as using the same file for a client and a server certificate does not make sense in a lot of environments. This patch fixes the issue by skipping the insertion of the SNI when no bind_conf is available in the ckch_inst. Change the reg-test to reproduce this corner case. Should fix issue #1748. Must be backported as far as 2.2. (it was previously in ssl_sock.c)
This commit is contained in:
parent
debaa04f9e
commit
cb6c5f4683
@ -50,6 +50,7 @@ haproxy h1 -conf {
|
|||||||
bind "${tmpdir}/ssl.sock" ssl strict-sni crt-list ${testdir}/localhost.crt-list
|
bind "${tmpdir}/ssl.sock" ssl strict-sni crt-list ${testdir}/localhost.crt-list
|
||||||
|
|
||||||
server s1 ${s1_addr}:${s1_port}
|
server s1 ${s1_addr}:${s1_port}
|
||||||
|
server s2 ${s1_addr}:${s1_port} ssl crt "${testdir}/common.pem" weight 0 verify none
|
||||||
} -start
|
} -start
|
||||||
|
|
||||||
|
|
||||||
@ -68,6 +69,7 @@ shell {
|
|||||||
echo "new ssl cert ${testdir}/ecdsa.pem" | socat "${tmpdir}/h1/stats" -
|
echo "new ssl cert ${testdir}/ecdsa.pem" | socat "${tmpdir}/h1/stats" -
|
||||||
printf "set ssl cert ${testdir}/ecdsa.pem <<\n$(cat ${testdir}/ecdsa.pem)\n\n" | socat "${tmpdir}/h1/stats" -
|
printf "set ssl cert ${testdir}/ecdsa.pem <<\n$(cat ${testdir}/ecdsa.pem)\n\n" | socat "${tmpdir}/h1/stats" -
|
||||||
echo "commit ssl cert ${testdir}/ecdsa.pem" | socat "${tmpdir}/h1/stats" -
|
echo "commit ssl cert ${testdir}/ecdsa.pem" | socat "${tmpdir}/h1/stats" -
|
||||||
|
printf "add ssl crt-list ${testdir}/localhost.crt-list/ <<\n${testdir}/common.pem [ssl-min-ver SSLv3 verify none allow-0rtt] !*\n\n" | socat "${tmpdir}/h1/stats" -
|
||||||
printf "add ssl crt-list ${testdir}/localhost.crt-list/ <<\n${testdir}/ecdsa.pem [ssl-min-ver SSLv3 verify none allow-0rtt] localhost !www.test1.com\n\n" | socat "${tmpdir}/h1/stats" -
|
printf "add ssl crt-list ${testdir}/localhost.crt-list/ <<\n${testdir}/ecdsa.pem [ssl-min-ver SSLv3 verify none allow-0rtt] localhost !www.test1.com\n\n" | socat "${tmpdir}/h1/stats" -
|
||||||
printf "add ssl crt-list ${testdir}/localhost.crt-list <<\n${testdir}/ecdsa.pem [verify none allow-0rtt]\n\n" | socat "${tmpdir}/h1/stats" -
|
printf "add ssl crt-list ${testdir}/localhost.crt-list <<\n${testdir}/ecdsa.pem [verify none allow-0rtt]\n\n" | socat "${tmpdir}/h1/stats" -
|
||||||
printf "add ssl crt-list ${testdir}/localhost.crt-list/// <<\n${testdir}/ecdsa.pem localhost !www.test1.com\n\n" | socat "${tmpdir}/h1/stats" -
|
printf "add ssl crt-list ${testdir}/localhost.crt-list/// <<\n${testdir}/ecdsa.pem localhost !www.test1.com\n\n" | socat "${tmpdir}/h1/stats" -
|
||||||
|
@ -1138,8 +1138,15 @@ static int cli_io_handler_add_crtlist(struct appctx *appctx)
|
|||||||
ctx->state = ADDCRT_ST_INSERT;
|
ctx->state = ADDCRT_ST_INSERT;
|
||||||
/* fallthrough */
|
/* fallthrough */
|
||||||
case ADDCRT_ST_INSERT:
|
case ADDCRT_ST_INSERT:
|
||||||
/* insert SNIs in bind_conf */
|
/* the insertion is called for every instance of the store, not
|
||||||
|
* only the one we generated.
|
||||||
|
* But the ssl_sock_load_cert_sni() skip the sni already
|
||||||
|
* inserted. Not every instance has a bind_conf, it could be
|
||||||
|
* the store of a server so we should be careful */
|
||||||
|
|
||||||
list_for_each_entry(new_inst, &store->ckch_inst, by_ckchs) {
|
list_for_each_entry(new_inst, &store->ckch_inst, by_ckchs) {
|
||||||
|
if (!new_inst->bind_conf) /* this is a server instance */
|
||||||
|
continue;
|
||||||
HA_RWLOCK_WRLOCK(SNI_LOCK, &new_inst->bind_conf->sni_lock);
|
HA_RWLOCK_WRLOCK(SNI_LOCK, &new_inst->bind_conf->sni_lock);
|
||||||
ssl_sock_load_cert_sni(new_inst, new_inst->bind_conf);
|
ssl_sock_load_cert_sni(new_inst, new_inst->bind_conf);
|
||||||
HA_RWLOCK_WRUNLOCK(SNI_LOCK, &new_inst->bind_conf->sni_lock);
|
HA_RWLOCK_WRUNLOCK(SNI_LOCK, &new_inst->bind_conf->sni_lock);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user