Commit e4a29f1b authored by Joe Orton's avatar Joe Orton
Browse files

* modules/ssl/ssl_engine_init.c (ssl_init_proxy_certs): Fail early

(rather than segfault later) if a client cert is configured which is
missing either the certificate or private key.

PR: 24030


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk/modules/ssl@101878 13f79535-47bb-0310-9956-ffa450edef68
parent e4e356d1
Loading
Loading
Loading
Loading
+24 −10
Original line number Diff line number Diff line
@@ -913,7 +913,7 @@ static void ssl_init_proxy_certs(server_rec *s,
                                 apr_pool_t *ptemp,
                                 modssl_ctx_t *mctx)
{
    int ncerts = 0;
    int n, ncerts = 0;
    STACK_OF(X509_INFO) *sk;
    modssl_pk_proxy_t *pkp = mctx->pkp;

@@ -934,18 +934,32 @@ static void ssl_init_proxy_certs(server_rec *s,
        SSL_X509_INFO_load_path(ptemp, sk, pkp->cert_path);
    }

    if ((ncerts = sk_X509_INFO_num(sk)) > 0) {
        ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
                     "loaded %d client certs for SSL proxy",
                     ncerts);

        pkp->certs = sk;
    }
    else {
    if ((ncerts = sk_X509_INFO_num(sk)) <= 0) {
        sk_X509_INFO_free(sk);
        ap_log_error(APLOG_MARK, APLOG_WARNING, 0, s,
                     "no client certs found for SSL proxy");
        return;
    }

    /* Check that all client certs have got certificates and private
     * keys. */
    for (n = 0; n < ncerts; n++) {
        X509_INFO *inf = sk_X509_INFO_value(sk, n);

        if (!inf->x509 || !inf->x_pkey) {
            sk_X509_INFO_free(sk);
            ap_log_error(APLOG_MARK, APLOG_STARTUP, 0, s,
                         "incomplete client cert configured for SSL proxy "
                         "(missing or encrypted private key?)");
            ssl_die();
            return;
        }
    }

    ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
                 "loaded %d client certs for SSL proxy",
                 ncerts);
    pkp->certs = sk;
}

static void ssl_init_proxy_ctx(server_rec *s,