Skip to content

Commit

Permalink
tls_ctx_load_ca: Improve certificate error messages
Browse files Browse the repository at this point in the history
If a CA certificate file includes intermediate certificates, and any
of them fail to verify, the current code will file with "Cannot load
CA certificate file".  Instead, generate a more specific error message
identifying the specific sub-certificate(s) which did not validate.

Acked-by: Steffan Karger <[email protected]>
Message-Id: <CAK6ywbLVtSgRZEt4N+02fz+vQ0GNp==5KdsbqWtZ+fgUzrZq+g@mail.gmail.com>
URL: http://article.gmane.org/gmane.network.openvpn.devel/7837

Signed-off-by: Gert Doering <[email protected]>
  • Loading branch information
kdienes authored and cron2 committed Nov 15, 2013
1 parent 16e24da commit 9927cdb
Showing 1 changed file with 24 additions and 3 deletions.
27 changes: 24 additions & 3 deletions src/openvpn/ssl_openssl.c
Original file line number Diff line number Diff line change
Expand Up @@ -743,7 +743,7 @@ tls_ctx_load_ca (struct tls_root_ctx *ctx, const char *ca_file,
X509_STORE *store = NULL;
X509_NAME *xn = NULL;
BIO *in = NULL;
int i, added = 0;
int i, added = 0, prev = 0;

ASSERT(NULL != ctx);

Expand All @@ -770,6 +770,11 @@ tls_ctx_load_ca (struct tls_root_ctx *ctx, const char *ca_file,
if (info->crl)
X509_STORE_add_crl (store, info->crl);

if (tls_server && !info->x509)
{
msg (M_SSLERR, "X509 name was missing in TLS mode");
}

if (info->x509)
{
X509_STORE_add_cert (store, info->x509);
Expand Down Expand Up @@ -799,15 +804,31 @@ tls_ctx_load_ca (struct tls_root_ctx *ctx, const char *ca_file,
sk_X509_NAME_push (cert_names, xn);
}
}

if (tls_server) {
int cnum = sk_X509_NAME_num (cert_names);
if (cnum != (prev + 1)) {
msg (M_WARN, "Cannot load CA certificate file %s (entry %d did not validate)", np(ca_file), added);
}
prev = cnum;
}

}
sk_X509_INFO_pop_free (info_stack, X509_INFO_free);
}

if (tls_server)
SSL_CTX_set_client_CA_list (ctx->ctx, cert_names);

if (!added || (tls_server && sk_X509_NAME_num (cert_names) != added))
msg (M_SSLERR, "Cannot load CA certificate file %s", np(ca_file));
if (!added)
msg (M_SSLERR, "Cannot load CA certificate file %s (no entries were read)", np(ca_file));

if (tls_server) {
int cnum = sk_X509_NAME_num (cert_names);
if (cnum != added)
msg (M_SSLERR, "Cannot load CA certificate file %s (only %d of %d entries were valid X509 names)", np(ca_file), cnum, added);
}

if (in)
BIO_free (in);
}
Expand Down

0 comments on commit 9927cdb

Please sign in to comment.