Hi. Attached is a patch that changes the behavior of X509_verify_cert in crypto/x509/x509_vfy.c While copying the cert chain into the X509_STORE_CTX, before adding a cert, a check is done to see if we could reach one of our trust anchors instead. This solves the problem with a certificate chain ending in a certificate not in the trust store, that would be acceptable using a different path.
Please see this as a request for comments, since I'm not an expert (yet) on X509 path discovery. Thanks in advance, Arne
diff -Naurp openssl-1.0.1c_diffa/crypto/x509/x509_vfy.c openssl-1.0.1c_diffb/crypto/x509/x509_vfy.c --- openssl-1.0.1c_diffa/crypto/x509/x509_vfy.c Fri Sep 23 15:39:35 2011 +++ openssl-1.0.1c_diffb/crypto/x509/x509_vfy.c Mon Jun 11 14:06:07 2012 @@ -209,6 +209,28 @@ int X509_verify_cert(X509_STORE_CTX *ctx) /* If we were passed a cert chain, use it first */ if (ctx->untrusted != NULL) { + /* Try to do a shortcut to a trust anchor, + * therefore look in cert store first */ + ok = ctx->get_issuer(&xtmp, ctx, x); + + /* error */ + if (ok < 0) return ok; + /* trust anchor found, use it, ignore rest of chain */ + if (ok != 0) + { + x = xtmp; + if (!sk_X509_push(ctx->chain,x)) + { + X509_free(xtmp); + X509err(X509_F_X509_VERIFY_CERT,ERR_R_MALLOC_FAILURE); + return 0; + } + num++; + /* sktmp is freed at the end */ + break; + } + + /* no trust anchor found, continue searching in chain */ xtmp=find_issuer(ctx, sktmp,x); if (xtmp != NULL) {