Skip to content

Commit 0b482b8

Browse files
Ross Hendersonliviuchircu
authored andcommitted
#3798 Don't require certificate for TLS clients
(cherry picked from commit bf9f69f)
1 parent 8b31d74 commit 0b482b8

3 files changed

Lines changed: 42 additions & 18 deletions

File tree

modules/tls_mgm/tls_mgm.c

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -642,11 +642,21 @@ static int init_tls_dom(struct tls_domain *d)
642642
}
643643

644644
if (!d->cert.s) {
645-
init_flags |= TLS_DOM_CERT_FILE_FL;
646-
LM_NOTICE("no certificate for tls domain '%.*s' defined, using default '%s'\n",
647-
d->name.len, ZSW(d->name.s), tls_cert_file);
648-
d->cert.s = tls_cert_file;
649-
d->cert.len = len(tls_cert_file);
645+
/* Client domains can operate without a certificate (RFC 8446 4.4.2.4,
646+
* RFC 5246 7.4.6) - an empty certificate message will be sent if the
647+
* server requests one. Server domains require a certificate. */
648+
if (d->flags & DOM_FLAG_SRV) {
649+
init_flags |= TLS_DOM_CERT_FILE_FL;
650+
LM_NOTICE("no certificate for tls server domain '%.*s' defined, "
651+
"using default '%s'\n",
652+
d->name.len, ZSW(d->name.s), tls_cert_file);
653+
d->cert.s = tls_cert_file;
654+
d->cert.len = len(tls_cert_file);
655+
} else {
656+
LM_INFO("no certificate for tls client domain '%.*s', "
657+
"will not send client certificate\n",
658+
d->name.len, ZSW(d->name.s));
659+
}
650660
}
651661

652662
if (!d->ca.s) {
@@ -722,6 +732,15 @@ static int init_tls_domains(struct tls_domain **dom)
722732
prev = NULL;
723733
while (d) {
724734
if (!d->pkey.s) {
735+
/* Client domains without a certificate don't need a private key */
736+
if (!d->cert.s && (d->flags & DOM_FLAG_CLI)) {
737+
LM_DBG("no private key needed for tls client domain '%.*s' "
738+
"(no certificate configured)\n",
739+
d->name.len, ZSW(d->name.s));
740+
prev = d;
741+
d = d->next;
742+
continue;
743+
}
725744
LM_NOTICE("no private key for tls domain '%.*s' defined, using default '%s'\n",
726745
d->name.len, ZSW(d->name.s), tls_pkey_file);
727746
d->pkey.s = tls_pkey_file;

modules/tls_openssl/openssl_config.c

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -831,14 +831,16 @@ int openssl_init_tls_dom(struct tls_domain *d, int init_flags)
831831
}
832832

833833
/*
834-
* load certificate
834+
* load certificate (optional for client domains per RFC 8446 4.4.2.4)
835835
*/
836-
if (!(d->flags & DOM_FLAG_DB) || init_flags & TLS_DOM_CERT_FILE_FL) {
837-
if (load_certificate(((void**)d->ctx)[i], d->cert.s) < 0)
838-
return -1;
839-
} else
840-
if (load_certificate_db(((void**)d->ctx)[i], &d->cert) < 0)
841-
return -1;
836+
if (d->cert.s) {
837+
if (!(d->flags & DOM_FLAG_DB) || init_flags & TLS_DOM_CERT_FILE_FL) {
838+
if (load_certificate(((void**)d->ctx)[i], d->cert.s) < 0)
839+
return -1;
840+
} else
841+
if (load_certificate_db(((void**)d->ctx)[i], &d->cert) < 0)
842+
return -1;
843+
}
842844

843845
/**
844846
* load crl from directory

modules/tls_wolfssl/wolfssl_config.c

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -532,12 +532,15 @@ int _wolfssl_init_tls_dom(struct tls_domain *d, int init_flags)
532532
goto end;
533533
}
534534

535-
if (!(d->flags & DOM_FLAG_DB) || init_flags & TLS_DOM_CERT_FILE_FL) {
536-
if (load_certificate(d->ctx, d->cert.s) < 0)
537-
goto end;
538-
} else {
539-
if (load_certificate_db(d->ctx, &d->cert) < 0)
540-
goto end;
535+
/* load certificate (optional for client domains per RFC 8446 4.4.2.4) */
536+
if (d->cert.s) {
537+
if (!(d->flags & DOM_FLAG_DB) || init_flags & TLS_DOM_CERT_FILE_FL) {
538+
if (load_certificate(d->ctx, d->cert.s) < 0)
539+
goto end;
540+
} else {
541+
if (load_certificate_db(d->ctx, &d->cert) < 0)
542+
goto end;
543+
}
541544
}
542545

543546
if (d->crl_directory && load_crl(d->ctx, d->crl_directory,

0 commit comments

Comments
 (0)