On Fri, Mar 16, 2018 at 03:25:08PM -0000, [email protected] wrote:
> Author: icing
> Date: Fri Mar 16 15:25:08 2018
> New Revision: 1826995
>
> URL: http://svn.apache.org/viewvc?rev=1826995&view=rev
> Log:
> Extend SSLOCSPEnable with mode 'leaf' that only checks the leaf of a
> certificate chain. PR62112 [Ricardo Martin Camarero <[email protected]>]
>
> Modified:
> httpd/httpd/trunk/docs/manual/mod/mod_ssl.xml
> httpd/httpd/trunk/modules/ssl/mod_ssl.c
> httpd/httpd/trunk/modules/ssl/ssl_engine_config.c
> httpd/httpd/trunk/modules/ssl/ssl_engine_init.c
> httpd/httpd/trunk/modules/ssl/ssl_engine_kernel.c
> httpd/httpd/trunk/modules/ssl/ssl_engine_ocsp.c
> httpd/httpd/trunk/modules/ssl/ssl_private.h
The bulk of this is copy and paste of code which remains largely
identical - ssl_cmd_crlcheck_parse to ssl_cmd_ocspcheck_parse etc,
though looks like the policy dumping stuff should be updated too.
Anybody good a good reason to think the CRL/OCSP checking mode
directives would diverge in the future or could we unify that code?
Index: modules/ssl/ssl_engine_config.c
===================================================================
--- modules/ssl/ssl_engine_config.c (revision 1827336)
+++ modules/ssl/ssl_engine_config.c (working copy)
@@ -1346,21 +1346,27 @@
return NULL;
}
-static const char *ssl_cmd_crlcheck_parse(cmd_parms *parms,
+#define IS_REVCHECK_OCSP(cmdname_) (strcmp((cmdname_), "SSLOCSPEnable") == 0)
+
+static const char *ssl_cmd_revcheck_parse(cmd_parms *parms,
const char *arg,
int *mask)
{
const char *w;
+ const char *notfor_arg;
+ notfor_arg = IS_REVCHECK_OCSP(parms->cmd->name) ?
+ "no_ocsp_for_cert_ok" : "no_crl_for_cert_ok";
+
w = ap_getword_conf(parms->temp_pool, &arg);
if (strcEQ(w, "none")) {
- *mask = SSL_CRLCHECK_NONE;
+ *mask = SSL_REVCHECK_NONE;
}
else if (strcEQ(w, "leaf")) {
- *mask = SSL_CRLCHECK_LEAF;
+ *mask = SSL_REVCHECK_LEAF;
}
else if (strcEQ(w, "chain")) {
- *mask = SSL_CRLCHECK_CHAIN;
+ *mask = SSL_REVCHECK_CHAIN;
}
else {
return apr_pstrcat(parms->temp_pool, parms->cmd->name,
@@ -1370,8 +1376,8 @@
while (*arg) {
w = ap_getword_conf(parms->temp_pool, &arg);
- if (strcEQ(w, "no_crl_for_cert_ok")) {
- *mask |= SSL_CRLCHECK_NO_CRL_FOR_CERT_OK;
+ if (strcEQ(w, notfor_arg)) {
+ *mask |= SSL_REVCHECK_NOT_FOR_CERT_OK;
}
else {
return apr_pstrcat(parms->temp_pool, parms->cmd->name,
@@ -1389,7 +1395,7 @@
{
SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
- return ssl_cmd_crlcheck_parse(cmd, arg, &sc->server->crl_check_mask);
+ return ssl_cmd_revcheck_parse(cmd, arg, &sc->server->crl_check_mask);
}
static const char *ssl_cmd_verify_parse(cmd_parms *parms,
@@ -1906,7 +1912,7 @@
{
SSLDirConfigRec *dc = (SSLDirConfigRec *)dcfg;
- return ssl_cmd_crlcheck_parse(cmd, arg, &dc->proxy->crl_check_mask);
+ return ssl_cmd_revcheck_parse(cmd, arg, &dc->proxy->crl_check_mask);
}
const char *ssl_cmd_SSLProxyMachineCertificateFile(cmd_parms *cmd,
@@ -1965,43 +1971,6 @@
return NULL;
}
-static const char *ssl_cmd_ocspcheck_parse(cmd_parms *parms,
- const char *arg,
- int *mask)
-{
- const char *w;
-
- w = ap_getword_conf(parms->temp_pool, &arg);
- if (strcEQ(w, "off")) {
- *mask = SSL_OCSPCHECK_NONE;
- }
- else if (strcEQ(w, "leaf")) {
- *mask = SSL_OCSPCHECK_LEAF;
- }
- else if (strcEQ(w, "on")) {
- *mask = SSL_OCSPCHECK_CHAIN;
- }
- else {
- return apr_pstrcat(parms->temp_pool, parms->cmd->name,
- ": Invalid argument '", w, "'",
- NULL);
- }
-
- while (*arg) {
- w = ap_getword_conf(parms->temp_pool, &arg);
- if (strcEQ(w, "no_ocsp_for_cert_ok")) {
- *mask |= SSL_OCSPCHECK_NO_OCSP_FOR_CERT_OK;
- }
- else {
- return apr_pstrcat(parms->temp_pool, parms->cmd->name,
- ": Invalid argument '", w, "'",
- NULL);
- }
- }
-
- return NULL;
-}
-
const char *ssl_cmd_SSLOCSPEnable(cmd_parms *cmd, void *dcfg, const char *arg)
{
SSLSrvConfigRec *sc = mySrvConfig(cmd->server);
@@ -2013,7 +1982,7 @@
}
#endif
- return ssl_cmd_ocspcheck_parse(cmd, arg, &sc->server->ocsp_mask);
+ return ssl_cmd_revcheck_parse(cmd, arg, &sc->server->ocsp_mask);
}
const char *ssl_cmd_SSLOCSPOverrideResponder(cmd_parms *cmd, void *dcfg, int
flag)
@@ -2600,21 +2569,24 @@
}
}
-static void val_crl_check_dump(apr_file_t *out, const char *key, int mask,
+static void val_rev_check_dump(apr_file_t *out, const char *key, int mask,
apr_pool_t *p, const char *indent, const char
**psep)
{
if (mask != UNSET) {
- if (mask == SSL_CRLCHECK_NONE) {
+ if (mask == SSL_REVCHECK_NONE) {
val_str_dump(out, key, "none", p, indent, psep);
}
- else if (mask == SSL_CRLCHECK_LEAF) {
+ else if (mask == SSL_REVCHECK_LEAF) {
val_str_dump(out, key, "leaf", p, indent, psep);
}
- else if (mask == SSL_CRLCHECK_CHAIN) {
+ else if (mask == SSL_REVCHECK_CHAIN) {
val_str_dump(out, key, "chain", p, indent, psep);
}
- else if (mask == (SSL_CRLCHECK_CHAIN|SSL_CRLCHECK_NO_CRL_FOR_CERT_OK))
{
- val_str_dump(out, key, "chain no_crl_for_cert_ok", p, indent,
psep);
+ else if (mask == (SSL_REVCHECK_CHAIN|SSL_REVCHECK_NOT_FOR_CERT_OK)) {
+ if (IS_REVCHECK_OCSP(key))
+ val_str_dump(out, key, "chain no_ocsp_for_cert_ok", p, indent,
psep);
+ else
+ val_str_dump(out, key, "chain no_crl_for_cert_ok", p, indent,
psep);
}
else {
val_str_dump(out, key, "???", p, indent, psep);
@@ -2678,8 +2650,8 @@
val_onoff_dump(out, k, v, p, indent, psep)
#define DMP_URI(k,v) \
val_uri_dump(out, k, v, p, indent, psep)
-#define DMP_CRLCHK(k,v) \
- val_crl_check_dump(out, k, v, p, indent, psep)
+#define DMP_REVCHK(k,v) \
+ val_rev_check_dump(out, k, v, p, indent, psep)
#define DMP_PHRASE(k,v, v2) \
val_pphrase_dump(out, k, v, v2, p, indent, psep)
#define DMP_ENABLD(k,v) \
@@ -2713,7 +2685,7 @@
DMP_STRING(proxy? "SSLProxyCARevocationFile" : "SSLCARevocationFile",
ctx->crl_file);
DMP_STRING(proxy? "SSLProxyCARevocationPath" : "SSLCARevocationPath",
ctx->crl_path);
- DMP_CRLCHK(proxy? "SSLProxyCARevocationCheck" : "SSLCARevocationCheck",
ctx->crl_check_mask);
+ DMP_REVCHK(proxy? "SSLProxyCARevocationCheck" : "SSLCARevocationCheck",
ctx->crl_check_mask);
if (!proxy) {
DMP_PHRASE("SSLPassPhraseDialog", ctx->pphrase_dialog_type,
ctx->pphrase_dialog_path);
if (ctx->pks) {
@@ -2738,7 +2710,7 @@
DMP_STRING("SSLSRPUnknownUserSeed", ctx->srp_unknown_user_seed);
DMP_STRING("SSLSRPVerifierFile", ctx->srp_vfile);
#endif
- DMP_LONG( "SSLOCSPEnable", ctx->ocsp_mask);
+ DMP_REVCHK( "SSLOCSPEnable", ctx->ocsp_mask);
DMP_ON_OFF("SSLOCSPOverrideResponder", ctx->ocsp_force_default);
DMP_STRING("SSLOCSPDefaultResponder", ctx->ocsp_responder);
DMP_LONG( "SSLOCSPResponseTimeSkew", ctx->ocsp_resptime_skew);
Index: modules/ssl/ssl_engine_init.c
===================================================================
--- modules/ssl/ssl_engine_init.c (revision 1827336)
+++ modules/ssl/ssl_engine_init.c (working copy)
@@ -945,7 +945,7 @@
int crl_check_mode;
if (mctx->ocsp_mask == UNSET) {
- mctx->ocsp_mask = SSL_OCSPCHECK_NONE;
+ mctx->ocsp_mask = SSL_REVCHECK_NONE;
}
if (mctx->crl_check_mask == UNSET) {
Index: modules/ssl/ssl_engine_kernel.c
===================================================================
--- modules/ssl/ssl_engine_kernel.c (revision 1827336)
+++ modules/ssl/ssl_engine_kernel.c (working copy)
@@ -1669,8 +1669,8 @@
/*
* Perform OCSP-based revocation checks
*/
- if (ok && ((sc->server->ocsp_mask & SSL_OCSPCHECK_CHAIN) ||
- (errdepth == 0 && (sc->server->ocsp_mask & SSL_OCSPCHECK_LEAF)))) {
+ if (ok && ((sc->server->ocsp_mask & SSL_REVCHECK_CHAIN) ||
+ (errdepth == 0 && (sc->server->ocsp_mask & SSL_REVCHECK_CHAIN)))) {
/* If there was an optional verification error, it's not
* possible to perform OCSP validation since the issuer may be
* missing/untrusted. Fail in that case. */
Index: modules/ssl/ssl_engine_ocsp.c
===================================================================
--- modules/ssl/ssl_engine_ocsp.c (revision 1827336)
+++ modules/ssl/ssl_engine_ocsp.c (working copy)
@@ -139,10 +139,10 @@
ruri = determine_responder_uri(sc, cert, c, pool);
if (!ruri) {
- if (sc->server->ocsp_mask & SSL_OCSPCHECK_NO_OCSP_FOR_CERT_OK) {
+ if (sc->server->ocsp_mask & SSL_REVCHECK_NOT_FOR_CERT_OK) {
ap_log_cerror(APLOG_MARK, APLOG_TRACE2, 0, c,
- "Skipping OCSP check for certificate cos no OCSP URL"
- " found and no_ocsp_for_cert_ok is set");
+ "Skipping OCSP check for certificate without OCSP
URL"
+ " and no_ocsp_for_cert_ok set");
return V_OCSP_CERTSTATUS_GOOD;
} else {
return V_OCSP_CERTSTATUS_UNKNOWN;
Index: modules/ssl/ssl_private.h
===================================================================
--- modules/ssl/ssl_private.h (revision 1827336)
+++ modules/ssl/ssl_private.h (working copy)
@@ -390,26 +390,22 @@
|| (errnum == X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE))
/**
- * CRL checking mask (mode | flags)
+ * Revocation (CRL/OCSP) checking mask (mode | flags)
*/
typedef enum {
- SSL_CRLCHECK_NONE = (0),
- SSL_CRLCHECK_LEAF = (1 << 0),
- SSL_CRLCHECK_CHAIN = (1 << 1),
+ SSL_REVCHECK_NONE = (0),
+ SSL_REVCHECK_LEAF = (1 << 0),
+ SSL_REVCHECK_CHAIN = (1 << 1),
-#define SSL_CRLCHECK_FLAGS (~0x3)
- SSL_CRLCHECK_NO_CRL_FOR_CERT_OK = (1 << 2)
-} ssl_crlcheck_t;
+#define SSL_REVCHECK_FLAGS (~0x3)
+ SSL_REVCHECK_NOT_FOR_CERT_OK = (1 << 2)
+} ssl_revcheck_t;
-/**
- * OCSP checking mask (mode | flags)
- */
-typedef enum {
- SSL_OCSPCHECK_NONE = (0),
- SSL_OCSPCHECK_LEAF = (1 << 0),
- SSL_OCSPCHECK_CHAIN = (1 << 1),
- SSL_OCSPCHECK_NO_OCSP_FOR_CERT_OK = (1 << 2)
-} ssl_ocspcheck_t;
+#define SSL_CRLCHECK_FLAGS SSL_REVCHECK_FLAGS
+#define SSL_CRLCHECK_NONE SSL_REVCHECK_NONE
+#define SSL_CRLCHECK_LEAF SSL_REVCHECK_LEAF
+#define SSL_CRLCHECK_CHAIN SSL_REVCHECK_CHAIN
+#define SSL_CRLCHECK_NO_CRL_FOR_CERT_OK SSL_REVCHECK_NOT_FOR_CERT_OK
/**
* Define the SSL pass phrase dialog types