And then rebuild and install libcrypto, isakmpd and unwind:
cd /usr/src/lib/libcrypto
make obj
make includes
make
make install
cd /usr/src/sbin/isakmpd
make obj
make
make install
cd /usr/src/sbin/unwind
make obj
make
make install
static int null_callback(int ok, X509_STORE_CTX *e);
static int check_issued(X509_STORE_CTX *ctx, X509 *x, X509 *issuer);
-static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x);
+static X509 *find_issuer(X509_STORE_CTX *ctx, STACK_OF(X509) *sk, X509 *x,
+ int allow_expired);
static int check_chain_extensions(X509_STORE_CTX *ctx);
static int check_name_constraints(X509_STORE_CTX *ctx);
static int check_trust(X509_STORE_CTX *ctx);
@@ -324,7 +325,25 @@ X509_verify_cert(X509_STORE_CTX *ctx)
}
/* If we were passed a cert chain, use it first */
if (ctx->untrusted != NULL) {
- xtmp = find_issuer(ctx, sktmp, x);
+ /*
+ * If we do not find a non-expired untrusted cert, peek
+ * ahead and see if we can satisify this from the trusted
+ * store. If not, see if we have an expired untrusted cert.
+ */
+ xtmp = find_issuer(ctx, sktmp, x, 0);
+ if (xtmp == NULL &&
+ !(ctx->param->flags & X509_V_FLAG_TRUSTED_FIRST)) {
+ ok = ctx->get_issuer(&xtmp, ctx, x);
+ if (ok < 0) {
+ ctx->error = X509_V_ERR_STORE_LOOKUP;
+ goto end;
+ }
+ if (ok > 0) {
+ X509_free(xtmp);
+ break;
+ }
+ xtmp = find_issuer(ctx, sktmp, x, 1);
+ }
if (xtmp != NULL) {
if (!sk_X509_push(ctx->chain, xtmp)) {
X509error(ERR_R_MALLOC_FAILURE);
@@ -562,7 +581,8 @@ X509_verify_cert(X509_STORE_CTX *ctx)
*/