Make AUTH_RULE_SUBJECT cert multi-valued
Constraints having multiple subject certs defined are fulfilled if authentication used one of the listed certificates.
This commit is contained in:
@@ -76,7 +76,6 @@ static inline bool is_multi_value_rule(auth_rule_t type)
|
|||||||
case AUTH_RULE_AAA_IDENTITY:
|
case AUTH_RULE_AAA_IDENTITY:
|
||||||
case AUTH_RULE_XAUTH_IDENTITY:
|
case AUTH_RULE_XAUTH_IDENTITY:
|
||||||
case AUTH_RULE_XAUTH_BACKEND:
|
case AUTH_RULE_XAUTH_BACKEND:
|
||||||
case AUTH_RULE_SUBJECT_CERT:
|
|
||||||
case AUTH_HELPER_SUBJECT_CERT:
|
case AUTH_HELPER_SUBJECT_CERT:
|
||||||
case AUTH_HELPER_SUBJECT_HASH_URL:
|
case AUTH_HELPER_SUBJECT_HASH_URL:
|
||||||
case AUTH_RULE_MAX:
|
case AUTH_RULE_MAX:
|
||||||
@@ -84,6 +83,7 @@ static inline bool is_multi_value_rule(auth_rule_t type)
|
|||||||
case AUTH_RULE_OCSP_VALIDATION:
|
case AUTH_RULE_OCSP_VALIDATION:
|
||||||
case AUTH_RULE_CRL_VALIDATION:
|
case AUTH_RULE_CRL_VALIDATION:
|
||||||
case AUTH_RULE_GROUP:
|
case AUTH_RULE_GROUP:
|
||||||
|
case AUTH_RULE_SUBJECT_CERT:
|
||||||
case AUTH_RULE_CA_CERT:
|
case AUTH_RULE_CA_CERT:
|
||||||
case AUTH_RULE_IM_CERT:
|
case AUTH_RULE_IM_CERT:
|
||||||
case AUTH_RULE_CERT_POLICY:
|
case AUTH_RULE_CERT_POLICY:
|
||||||
@@ -503,8 +503,9 @@ METHOD(auth_cfg_t, complies, bool,
|
|||||||
private_auth_cfg_t *this, auth_cfg_t *constraints, bool log_error)
|
private_auth_cfg_t *this, auth_cfg_t *constraints, bool log_error)
|
||||||
{
|
{
|
||||||
enumerator_t *e1, *e2;
|
enumerator_t *e1, *e2;
|
||||||
bool success = TRUE, group_match = FALSE;
|
bool success = TRUE, group_match = FALSE, cert_match = FALSE;
|
||||||
identification_t *require_group = NULL;
|
identification_t *require_group = NULL;
|
||||||
|
certificate_t *require_cert = NULL;
|
||||||
signature_scheme_t scheme = SIGN_UNKNOWN;
|
signature_scheme_t scheme = SIGN_UNKNOWN;
|
||||||
u_int strength = 0;
|
u_int strength = 0;
|
||||||
auth_rule_t t1, t2;
|
auth_rule_t t1, t2;
|
||||||
@@ -542,20 +543,21 @@ METHOD(auth_cfg_t, complies, bool,
|
|||||||
}
|
}
|
||||||
case AUTH_RULE_SUBJECT_CERT:
|
case AUTH_RULE_SUBJECT_CERT:
|
||||||
{
|
{
|
||||||
certificate_t *c1, *c2;
|
certificate_t *cert;
|
||||||
|
|
||||||
c1 = (certificate_t*)value;
|
/* for certs, a match of a single cert is sufficient */
|
||||||
c2 = get(this, AUTH_RULE_SUBJECT_CERT);
|
require_cert = (certificate_t*)value;
|
||||||
if (!c2 || !c1->equals(c1, c2))
|
|
||||||
|
e2 = create_enumerator(this);
|
||||||
|
while (e2->enumerate(e2, &t2, &cert))
|
||||||
{
|
{
|
||||||
success = FALSE;
|
if (t2 == AUTH_RULE_SUBJECT_CERT &&
|
||||||
if (log_error)
|
cert->equals(cert, require_cert))
|
||||||
{
|
{
|
||||||
DBG1(DBG_CFG, "constraint check failed: peer not "
|
cert_match = TRUE;
|
||||||
"authenticated with peer cert '%Y'.",
|
|
||||||
c1->get_subject(c1));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
e2->destroy(e2);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case AUTH_RULE_CRL_VALIDATION:
|
case AUTH_RULE_CRL_VALIDATION:
|
||||||
@@ -828,6 +830,17 @@ METHOD(auth_cfg_t, complies, bool,
|
|||||||
}
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (require_cert && !cert_match)
|
||||||
|
{
|
||||||
|
if (log_error)
|
||||||
|
{
|
||||||
|
DBG1(DBG_CFG, "constraint check failed: peer not "
|
||||||
|
"authenticated with peer cert '%Y'.",
|
||||||
|
require_cert->get_subject(require_cert));
|
||||||
|
}
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user