Index: docs/conf/extra/httpd-ssl.conf.in =================================================================== --- docs/conf/extra/httpd-ssl.conf.in (revision 1331393) +++ docs/conf/extra/httpd-ssl.conf.in (working copy) @@ -142,12 +142,15 @@ # of them (file must be PEM encoded). # The CRL checking mode needs to be configured explicitly # through SSLCARevocationCheck (defaults to "none" otherwise). +# Client certificates issued by CAs that do not have a CRL are +# rejected unless SSLCARevocationAllowMissing is set to "on". # Note: Inside SSLCARevocationPath you need hash symlinks # to point to the certificate files. Use the provided # Makefile to update the hash symlinks after changes. #SSLCARevocationPath "@exp_sysconfdir@/ssl.crl" #SSLCARevocationFile "@exp_sysconfdir@/ssl.crl/ca-bundle.crl" #SSLCARevocationCheck chain +#SSLCARevocationAllowMissing on # Client Authentication (Type): # Client certificate verification type and depth. Types are Index: docs/manual/mod/mod_ssl.xml =================================================================== --- docs/manual/mod/mod_ssl.xml (revision 1331393) +++ docs/manual/mod/mod_ssl.xml (working copy) @@ -1087,6 +1087,9 @@ when checking is enabled, CRLs must be present for the validation to succeed - otherwise it will fail with an "unable to get certificate CRL" error. +The pre-2.3.15 behavior can be restored by setting the +SSLCARevocationAllowMissing directive +to "on".

Example @@ -1098,6 +1101,34 @@ +SSLCARevocationAllowMissing +Allow connections when there is no CRL present for a CA + +SSLCARevocationAllowMissing off|on +SSLCARevocationAllowMissing off +server config +virtual host + + +

+By default the CRL checking in mod_ssl will reject connections if a client +certificate is signed by a CA that does not have a CRL available in any of the +locations configured with +SSLCARevocationFile +or SSLCARevocationPath. +Setting this directive to "on" will change this behavior, and make mod_ssl +assume that a missing CRL means that no certificates signed by that CA are +revoked. +

+Example + +SSLCARevocationAllowMissing on + + +
+
+ + SSLVerifyClient Type of Client Certificate verification SSLVerifyClient level Index: modules/ssl/ssl_private.h =================================================================== --- modules/ssl/ssl_private.h (revision 1331393) +++ modules/ssl/ssl_private.h (working copy) @@ -628,6 +628,7 @@ const char *crl_path; const char *crl_file; ssl_crlcheck_t crl_check_mode; + BOOL crl_allow_missing; #ifdef HAVE_OCSP_STAPLING /** OCSP stapling options */ @@ -726,6 +727,7 @@ const char *ssl_cmd_SSLCARevocationPath(cmd_parms *, void *, const char *); const char *ssl_cmd_SSLCARevocationFile(cmd_parms *, void *, const char *); const char *ssl_cmd_SSLCARevocationCheck(cmd_parms *, void *, const char *); +const char *ssl_cmd_SSLCARevocationAllowMissing(cmd_parms *, void *, const char *); const char *ssl_cmd_SSLHonorCipherOrder(cmd_parms *cmd, void *dcfg, int flag); const char *ssl_cmd_SSLVerifyClient(cmd_parms *, void *, const char *); const char *ssl_cmd_SSLVerifyDepth(cmd_parms *, void *, const char *); Index: modules/ssl/mod_ssl.c =================================================================== --- modules/ssl/mod_ssl.c (revision 1331393) +++ modules/ssl/mod_ssl.c (working copy) @@ -119,6 +119,9 @@ "('/path/to/file' - PEM encoded)") SSL_CMD_SRV(CARevocationCheck, TAKE1, "SSL CA Certificate Revocation List (CRL) checking mode") + SSL_CMD_SRV(CARevocationAllowMissing, TAKE1, + "SSL: whether to accept certificates without a corresponding CRL" + "('yes', 'no')") SSL_CMD_ALL(VerifyClient, TAKE1, "SSL Client verify type " "('none', 'optional', 'require', 'optional_no_ca')") Index: modules/ssl/ssl_engine_config.c =================================================================== --- modules/ssl/ssl_engine_config.c (revision 1331393) +++ modules/ssl/ssl_engine_config.c (working copy) @@ -124,6 +124,7 @@ mctx->crl_path = NULL; mctx->crl_file = NULL; mctx->crl_check_mode = SSL_CRLCHECK_UNSET; + mctx->crl_allow_missing = FALSE; mctx->auth.ca_cert_path = NULL; mctx->auth.ca_cert_file = NULL; @@ -247,6 +248,7 @@ cfgMerge(crl_path, NULL); cfgMerge(crl_file, NULL); cfgMerge(crl_check_mode, SSL_CRLCHECK_UNSET); + cfgMergeBool(crl_allow_missing); cfgMergeString(auth.ca_cert_path); cfgMergeString(auth.ca_cert_file); @@ -964,6 +966,24 @@ return ssl_cmd_crlcheck_parse(cmd, arg, &sc->server->crl_check_mode); } +const char *ssl_cmd_SSLCARevocationAllowMissing(cmd_parms *cmd, + void *dcfg, + const char *arg) +{ + SSLSrvConfigRec *sc = mySrvConfig(cmd->server); + + if (!strcasecmp(arg, "On")) { + sc->server->crl_allow_missing = TRUE; + return NULL; + } + else if (!strcasecmp(arg, "Off")) { + sc->server->crl_allow_missing = FALSE; + return NULL; + } + + return "Argument must be On or Off"; +} + static const char *ssl_cmd_verify_parse(cmd_parms *parms, const char *arg, ssl_verify_t *id) Index: modules/ssl/ssl_engine_kernel.c =================================================================== --- modules/ssl/ssl_engine_kernel.c (revision 1331393) +++ modules/ssl/ssl_engine_kernel.c (working copy) @@ -1434,6 +1434,16 @@ */ return TRUE; } + + /* + * Ignore a missing CRL if SSLCARevocationAllowMissing is set to "On". + */ + if (mctx->crl_allow_missing == TRUE && + errnum == X509_V_ERR_UNABLE_TO_GET_CRL) + { + X509_STORE_CTX_set_error(ctx, X509_V_OK); + return TRUE; + } if (ssl_verify_error_is_optional(errnum) && (verify == SSL_CVERIFY_OPTIONAL_NO_CA))