Skip to content

Commit d209e0e

Browse files
authored
feat: add SubjectCertificatePolicyValidator (#1) (#2)
Signed-off-by: Mart Somermaa <[email protected]> Co-authored-by: Mart Somermaa <[email protected]>
1 parent 1e122e1 commit d209e0e

11 files changed

+176
-10
lines changed
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.webeid.security.exceptions;
2+
3+
/**
4+
* Thrown when any of the configured disallowed policies is present in the user certificate.
5+
*/
6+
public class UserCertificateDisallowedPolicyException extends TokenValidationException {
7+
public UserCertificateDisallowedPolicyException() {
8+
super("Disallowed user certificate policy");
9+
}
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.webeid.security.exceptions;
2+
3+
/**
4+
* Thrown when the user certificate policy is invalid.
5+
*/
6+
public class UserCertificateInvalidPolicyException extends TokenValidationException {
7+
public UserCertificateInvalidPolicyException() {
8+
super("User certificate policy is invalid");
9+
}
10+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.webeid.security.util;
2+
3+
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
4+
5+
public final class SubjectCertificatePolicies {
6+
7+
public static final ASN1ObjectIdentifier EST_MOBILE_ID_POLICY = new ASN1ObjectIdentifier("1.3.6.1.4.1.10015.1.3");
8+
9+
private SubjectCertificatePolicies() {
10+
throw new IllegalStateException("Constants class");
11+
}
12+
}

src/main/java/org/webeid/security/validator/AuthTokenValidationConfiguration.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,21 @@
2222

2323
package org.webeid.security.validator;
2424

25+
import com.google.common.collect.Sets;
26+
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
2527
import org.webeid.security.validator.validators.OriginValidator;
2628

2729
import javax.cache.Cache;
2830
import java.net.URI;
2931
import java.security.cert.X509Certificate;
3032
import java.time.Duration;
3133
import java.time.LocalDateTime;
32-
import java.util.ArrayList;
3334
import java.util.Collection;
35+
import java.util.HashSet;
3436
import java.util.Objects;
3537

3638
import static org.webeid.security.nonce.NonceGeneratorBuilder.requirePositiveDuration;
39+
import static org.webeid.security.util.SubjectCertificatePolicies.EST_MOBILE_ID_POLICY;
3740

3841
/**
3942
* Stores configuration parameters for {@link AuthTokenValidatorImpl}.
@@ -42,25 +45,28 @@ final class AuthTokenValidationConfiguration {
4245

4346
private URI siteOrigin;
4447
private Cache<String, LocalDateTime> nonceCache;
45-
private Collection<X509Certificate> trustedCACertificates = new ArrayList<>();
48+
private Collection<X509Certificate> trustedCACertificates = new HashSet<>();
4649
private boolean isUserCertificateRevocationCheckWithOcspEnabled = true;
4750
private Duration ocspRequestTimeout = Duration.ofSeconds(5);
4851
private Duration allowedClientClockSkew = Duration.ofMinutes(3);
4952
private boolean isSiteCertificateFingerprintValidationEnabled = false;
5053
private String siteCertificateSha256Fingerprint;
54+
// Don't allow Estonian Mobile-ID policy by default.
55+
private Collection<ASN1ObjectIdentifier> disallowedSubjectCertificatePolicies = Sets.newHashSet(EST_MOBILE_ID_POLICY);
5156

5257
AuthTokenValidationConfiguration() {
5358
}
5459

5560
private AuthTokenValidationConfiguration(AuthTokenValidationConfiguration other) {
5661
this.siteOrigin = other.siteOrigin;
5762
this.nonceCache = other.nonceCache;
58-
this.trustedCACertificates = new ArrayList<>(other.trustedCACertificates);
63+
this.trustedCACertificates = new HashSet<>(other.trustedCACertificates);
5964
this.isUserCertificateRevocationCheckWithOcspEnabled = other.isUserCertificateRevocationCheckWithOcspEnabled;
6065
this.ocspRequestTimeout = other.ocspRequestTimeout;
6166
this.allowedClientClockSkew = other.allowedClientClockSkew;
6267
this.isSiteCertificateFingerprintValidationEnabled = other.isSiteCertificateFingerprintValidationEnabled;
6368
this.siteCertificateSha256Fingerprint = other.siteCertificateSha256Fingerprint;
69+
this.disallowedSubjectCertificatePolicies = new HashSet<>(other.disallowedSubjectCertificatePolicies);
6470
}
6571

6672
void setSiteOrigin(URI siteOrigin) {
@@ -144,4 +150,9 @@ void validate() {
144150
AuthTokenValidationConfiguration copy() {
145151
return new AuthTokenValidationConfiguration(this);
146152
}
153+
154+
public Collection<ASN1ObjectIdentifier> getDisallowedSubjectCertificatePolicies() {
155+
return disallowedSubjectCertificatePolicies;
156+
}
157+
147158
}

src/main/java/org/webeid/security/validator/AuthTokenValidatorBuilder.java

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
package org.webeid.security.validator;
2424

25+
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
2526
import org.slf4j.Logger;
2627
import org.slf4j.LoggerFactory;
2728

@@ -30,7 +31,7 @@
3031
import java.security.cert.X509Certificate;
3132
import java.time.Duration;
3233
import java.time.LocalDateTime;
33-
import java.util.Arrays;
34+
import java.util.Collections;
3435

3536
/**
3637
* Builder for constructing {@link AuthTokenValidator} instances.
@@ -81,11 +82,25 @@ public AuthTokenValidatorBuilder withNonceCache(Cache<String, LocalDateTime> cac
8182
* @return the builder instance for method chaining
8283
*/
8384
public AuthTokenValidatorBuilder withTrustedCertificateAuthorities(X509Certificate... certificates) {
84-
configuration.getTrustedCACertificates().addAll(Arrays.asList(certificates));
85+
Collections.addAll(configuration.getTrustedCACertificates(), certificates);
8586
LOG.debug("Trusted certificate authorities set to {}", configuration.getTrustedCACertificates());
8687
return this;
8788
}
8889

90+
/**
91+
* Sets the list of disallowed user certificate policies.
92+
* In order for the user certificate to be considered valid, it must not contain any policies
93+
* present in this list.
94+
*
95+
* @param policies disallowed user certificate policies
96+
* @return the builder instance for method chaining
97+
*/
98+
public AuthTokenValidatorBuilder withDisallowedCertificatePolicies(ASN1ObjectIdentifier... policies) {
99+
Collections.addAll(configuration.getDisallowedSubjectCertificatePolicies(), policies);
100+
LOG.debug("Disallowed subject certificate policies set to {}", configuration.getDisallowedSubjectCertificatePolicies());
101+
return this;
102+
}
103+
89104
/**
90105
* Turns off user certificate revocation check with OCSP.
91106
* <p>

src/main/java/org/webeid/security/validator/AuthTokenValidatorImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,8 @@ final class AuthTokenValidatorImpl implements AuthTokenValidator {
7272

7373
simpleSubjectCertificateValidators = ValidatorBatch.createFrom(
7474
FunctionalSubjectCertificateValidators::validateCertificateExpiry,
75-
FunctionalSubjectCertificateValidators::validateCertificatePurpose
75+
FunctionalSubjectCertificateValidators::validateCertificatePurpose,
76+
new SubjectCertificatePolicyValidator(configuration.getDisallowedSubjectCertificatePolicies())::validateCertificatePolicies
7677
);
7778
tokenBodyValidators = ValidatorBatch.createFrom(
7879
new NonceValidator(configuration.getNonceCache())::validateNonce,
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package org.webeid.security.validator.validators;
2+
3+
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
4+
import org.bouncycastle.asn1.x509.CertificatePolicies;
5+
import org.bouncycastle.asn1.x509.Extension;
6+
import org.bouncycastle.asn1.x509.PolicyInformation;
7+
import org.bouncycastle.cert.jcajce.JcaX509ExtensionUtils;
8+
import org.webeid.security.exceptions.TokenValidationException;
9+
import org.webeid.security.exceptions.UserCertificateDisallowedPolicyException;
10+
import org.webeid.security.exceptions.UserCertificateInvalidPolicyException;
11+
import org.webeid.security.validator.AuthTokenValidatorData;
12+
13+
import java.io.IOException;
14+
import java.security.cert.X509Certificate;
15+
import java.util.Arrays;
16+
import java.util.Collection;
17+
import java.util.Optional;
18+
19+
public class SubjectCertificatePolicyValidator {
20+
21+
private final Collection<ASN1ObjectIdentifier> disallowedSubjectCertificatePolicies;
22+
23+
public SubjectCertificatePolicyValidator(Collection<ASN1ObjectIdentifier> disallowedSubjectCertificatePolicies) {
24+
this.disallowedSubjectCertificatePolicies = disallowedSubjectCertificatePolicies;
25+
}
26+
27+
/**
28+
* Validates that the user certificate policies match the configured policies.
29+
*
30+
* @param actualTokenData authentication token data that contains the user certificate.
31+
* @throws UserCertificateDisallowedPolicyException when user certificate policy does not match the configured policies.
32+
* @throws UserCertificateInvalidPolicyException when user certificate policy is invalid.
33+
*/
34+
public void validateCertificatePolicies(AuthTokenValidatorData actualTokenData) throws TokenValidationException {
35+
final X509Certificate certificate = actualTokenData.getSubjectCertificate();
36+
final byte[] extensionValue = certificate.getExtensionValue(Extension.certificatePolicies.getId());
37+
try {
38+
final CertificatePolicies policies = CertificatePolicies.getInstance(
39+
JcaX509ExtensionUtils.parseExtensionValue(extensionValue)
40+
);
41+
final Optional<PolicyInformation> disallowedPolicy = Arrays.stream(policies.getPolicyInformation())
42+
.filter(policyInformation ->
43+
disallowedSubjectCertificatePolicies.contains(policyInformation.getPolicyIdentifier()))
44+
.findFirst();
45+
if (disallowedPolicy.isPresent()) {
46+
throw new UserCertificateDisallowedPolicyException();
47+
}
48+
} catch (IOException e) {
49+
throw new UserCertificateInvalidPolicyException();
50+
}
51+
}
52+
}

src/test/java/org/webeid/security/testutil/AuthTokenValidators.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
package org.webeid.security.testutil;
2424

25+
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
2526
import org.webeid.security.validator.AuthTokenValidator;
2627
import org.webeid.security.validator.AuthTokenValidatorBuilder;
2728

@@ -34,6 +35,7 @@
3435
public final class AuthTokenValidators {
3536

3637
private static final String TOKEN_ORIGIN_URL = "https://ria.ee";
38+
private static final ASN1ObjectIdentifier EST_IDEMIA_POLICY = new ASN1ObjectIdentifier("1.3.6.1.4.1.51361.1.2.1");
3739

3840
public static AuthTokenValidator getAuthTokenValidator(Cache<String, LocalDateTime> cache) throws CertificateException {
3941
return getAuthTokenValidator(TOKEN_ORIGIN_URL, cache);
@@ -65,6 +67,12 @@ public static AuthTokenValidator getAuthTokenValidatorWithWrongTrustedCA(Cache<S
6567
CertificateLoader.loadCertificatesFromResources("ESTEID2018.cer"));
6668
}
6769

70+
public static AuthTokenValidator getAuthTokenValidatorWithDisallowedESTEIDPolicy(Cache<String, LocalDateTime> cache) throws CertificateException {
71+
return getAuthTokenValidatorBuilder(TOKEN_ORIGIN_URL, cache, getCACertificates())
72+
.withDisallowedCertificatePolicies(EST_IDEMIA_POLICY)
73+
.build();
74+
}
75+
6876
private static AuthTokenValidatorBuilder getAuthTokenValidatorBuilder(String uri, Cache<String, LocalDateTime> cache, X509Certificate[] certificates) {
6977
return new AuthTokenValidatorBuilder()
7078
.withSiteOrigin(URI.create(uri))

src/test/java/org/webeid/security/testutil/Tokens.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,15 @@ public final class Tokens {
9191
//-----------------------------------------------------------------------------------------------------------------
9292

9393
public static final String TOKEN_TOO_SHORT = new String(new char[99]);
94-
9594
public static final String TOKEN_TOO_LONG = new String(new char[10001]);
9695

9796
//-----------------------------------------------------------------------------------------------------------------
9897

98+
public static final String X5C_WRONG_POLICY_CERTIFICATE = "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsIng1YyI6WyJNSUlFQVRDQ0EyT2dBd0lCQWdJUU9Xa0JXWE5ESm0xYnlGZDNYc1drdmpBS0JnZ3Foa2pPUFFRREJEQmdNUXN3Q1FZRFZRUUdFd0pGUlRFYk1Ca0dBMVVFQ2d3U1Uwc2dTVVFnVTI5c2RYUnBiMjV6SUVGVE1SY3dGUVlEVlFSaERBNU9WRkpGUlMweE1EYzBOekF4TXpFYk1Ca0dBMVVFQXd3U1ZFVlRWQ0J2WmlCRlUxUkZTVVF5TURFNE1CNFhEVEU0TVRBeE9EQTVOVEEwTjFvWERUSXpNVEF4TnpJeE5UazFPVm93ZnpFTE1Ba0dBMVVFQmhNQ1JVVXhLakFvQmdOVkJBTU1JVXJEbFVWUFVrY3NTa0ZCU3kxTFVrbFRWRXBCVGl3ek9EQXdNVEE0TlRjeE9ERVFNQTRHQTFVRUJBd0hTc09WUlU5U1J6RVdNQlFHQTFVRUtnd05Ta0ZCU3kxTFVrbFRWRXBCVGpFYU1CZ0dBMVVFQlJNUlVFNVBSVVV0TXpnd01ERXdPRFUzTVRnd2RqQVFCZ2NxaGtqT1BRSUJCZ1VyZ1FRQUlnTmlBQVI1azFsWHp2U2VJOU8vMXMxcFp2amhFVzhuSXRKb0cwRUJGeG1MRVk2UzdraTF2RjJRM1RFRHg2ZE56dEkxWHR4OTZjczhyNHpZVHdkaVFvRGc3azNkaVV1UjluVFdHeFFFTU8xRkRvNFk5ZkFtaVBHV1QrK0d1T1ZvWlFZM1h4aWpnZ0hCTUlJQnZUQUpCZ05WSFJNRUFqQUFNQTRHQTFVZER3RUIvd1FFQXdJRGlEQkZCZ05WSFNBRVBqQThNREFHQ1NzR0FRUUJ6aDhCQXpBak1DRUdDQ3NHQVFVRkJ3SUJGaFZvZEhSd2N6b3ZMM2QzZHk1emF5NWxaUzlEVUZNd0NBWUdCQUNQZWdFQ01COEdBMVVkRVFRWU1CYUJGRE00TURBeE1EZzFOekU0UUdWbGMzUnBMbVZsTUIwR0ExVWREZ1FXQkJUa0xMMDBDUkFWVERFcG9jbVYrVzRtMkNibXdEQmhCZ2dyQmdFRkJRY0JBd1JWTUZNd1VRWUdCQUNPUmdFRk1FY3dSUlkvYUhSMGNITTZMeTl6YXk1bFpTOWxiaTl5WlhCdmMybDBiM0o1TDJOdmJtUnBkR2x2Ym5NdFptOXlMWFZ6WlMxdlppMWpaWEowYVdacFkyRjBaWE12RXdKRlRqQWdCZ05WSFNVQkFmOEVGakFVQmdnckJnRUZCUWNEQWdZSUt3WUJCUVVIQXdRd0h3WURWUjBqQkJnd0ZvQVV3SVNaS2NST256c0NOUGFaNFFwV0FBZ3BQbnN3Y3dZSUt3WUJCUVVIQVFFRVp6QmxNQ3dHQ0NzR0FRVUZCekFCaGlCb2RIUndPaTh2WVdsaExtUmxiVzh1YzJzdVpXVXZaWE4wWldsa01qQXhPREExQmdnckJnRUZCUWN3QW9ZcGFIUjBjRG92TDJNdWMyc3VaV1V2VkdWemRGOXZabDlGVTFSRlNVUXlNREU0TG1SbGNpNWpjblF3Q2dZSUtvWkl6ajBFQXdRRGdZc0FNSUdIQWtJQjlWTEpqSGJTMmJZdWRSYXRrRWVNRkpBTUtiSjRiQVZkaDBLbEZ4V0FTZXhGNXl3cEdsNDNXU3BCNlFBWHpORUJNZTFGSVdpT0l1ZDQ0aWV4TldPMWpnQUNRUTErTSt0YVo0aHlXcVNOVzVEQ0lpVVA3WXU0V3ZIM1NVakVxUUhiT1FzaHlNaDVFTTFwVmN2T24vWmdPeEx0NkVUdjlhdm5oVk13MnpUZDFiOHU0RUZrIl19.eyJhdWQiOlsiaHR0cHM6Ly9yaWEuZWUiLCJ1cm46Y2VydDpzaGEtMjU2OjZmMGRmMjQ0ZTRhODU2Yjk0YjNiM2I0NzU4MmEwYTUxYTMyZDY3NGRiYzcxMDcyMTFlZDIzZDRiZWM2ZDljNzIiXSwiZXhwIjoiMTU4Njg3MTE2OSIsImlhdCI6IjE1ODY4NzA4NjkiLCJpc3MiOiJ3ZWItZWlkIGFwcCB2MC45LjAtMS1nZTZlODlmYSIsIm5vbmNlIjoiMTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgiLCJzdWIiOiJKXHUwMGQ1RU9SRyxKQUFLLUtSSVNUSkFOLDM4MDAxMDg1NzE4In0";
99+
public static final String X5C_MOBILE_ID_CERTIFICATE = "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsIng1YyI6WyJNSUlGbURDQ0E0Q2dBd0lCQWdJUU13Y3k4WWdndjJsZlRUS0xRT2hOWVRBTkJna3Foa2lHOXcwQkFRc0ZBREJqTVFzd0NRWURWUVFHRXdKRlJURWlNQ0FHQTFVRUNnd1pRVk1nVTJWeWRHbG1hWFJ6WldWeWFXMXBjMnRsYzJ0MWN6RVhNQlVHQTFVRVlRd09UbFJTUlVVdE1UQTNORGN3TVRNeEZ6QVZCZ05WQkFNTURrVlRWRVZKUkMxVFN5QXlNREUxTUI0WERUSXdNRGd6TVRFM01qVXpNVm9YRFRJMU1EZ3pNVEl3TlRrMU9Wb3djVEVMTUFrR0ExVUVCaE1DUlVVeEl6QWhCZ05WQkFNTUdrdkRsVlpGVWxOQlVpeE5RVlJKTERNNE16QTVNVFF3TkRJd01SSXdFQVlEVlFRRURBbEx3NVZXUlZKVFFWSXhEVEFMQmdOVkJDb01CRTFCVkVreEdqQVlCZ05WQkFVVEVWQk9UMFZGTFRNNE16QTVNVFF3TkRJd01Ga3dFd1lIS29aSXpqMENBUVlJS29aSXpqMERBUWNEUWdBRUpjZ0lqWkVFSXlJTUdWbGkxeHA4OFlsUzhQbldCQ2NYZEJpQlRETmlWVC80T2xUVHRlQkJJZVBuMnZLV09nVU5ET1d5RnNCUVJQeTkzUGlnMnRoQXpxT0NBZ013Z2dIL01Ba0dBMVVkRXdRQ01BQXdEZ1lEVlIwUEFRSC9CQVFEQWdPSU1ISUdBMVVkSUFSck1Ha3dYUVlKS3dZQkJBSE9Id0VETUZBd0x3WUlLd1lCQlFVSEFnRVdJMmgwZEhCek9pOHZkM2QzTG5OckxtVmxMM0psY0c5emFYUnZiM0pwZFcwdlExQlRNQjBHQ0NzR0FRVUZCd0lDTUJFYUQwTnZiblJ5WVdOMElERXVNVEV0T1RBSUJnWUVBSTk2QVFJd0lRWURWUjBSQkJvd0dJRVdiV0YwYVM1cmIzWmxjbk5oY2tCbFpYTjBhUzVsWlRBZEJnTlZIUTRFRmdRVWFOVzZuMjlhTVJiVUxQdEl5dm1ScTUwZzhnOHdId1lEVlIwakJCZ3dGb0FVczZ1SXZKblZZcVNGS2dqTnRCMXlPNE55UjFFd2FnWUlLd1lCQlFVSEFRRUVYakJjTUNjR0NDc0dBUVVGQnpBQmhodG9kSFJ3T2k4dllXbGhMbk5yTG1WbEwyVnpkR1ZwWkRJd01UVXdNUVlJS3dZQkJRVUhNQUtHSldoMGRIQTZMeTlqTG5OckxtVmxMMFZUVkVWSlJDMVRTMTh5TURFMUxtUmxjaTVqY25Rd1lRWUlLd1lCQlFVSEFRTUVWVEJUTUZFR0JnUUFqa1lCQlRCSE1FVVdQMmgwZEhCek9pOHZjMnN1WldVdlpXNHZjbVZ3YjNOcGRHOXllUzlqYjI1a2FYUnBiMjV6TFdadmNpMTFjMlV0YjJZdFkyVnlkR2xtYVdOaGRHVnpMeE1DUlU0d1BBWURWUjBmQkRVd016QXhvQytnTFlZcmFIUjBjRG92TDNkM2R5NXpheTVsWlM5amNteHpMMlZ6ZEdWcFpDOWxjM1JsYVdReU1ERTFMbU55YkRBTkJna3Foa2lHOXcwQkFRc0ZBQU9DQWdFQUZ2WW1tYWVOdmg2dmFraXprdjZIdlhZWFhEdlRJVkE3WjNXc1hOOVpmZnZxaXFNNndnOWlJQmlXalVFNXFLaDBzVmE2cWx4VEhKOTBrZWx0Z1dzTGtQYnlDZUp2c2w3bnBJKy8zTnZIandSODNkSHptaThWMjF6TEFWd2czbkdwYmtsZzJ1VFBBYWdRZlJ3YTkxRDMrU1B1LzJVbzZhL3Z3SlZUYU1aUCtQRUhFa0NtTnV3UEFFQ2dubmlOZ2N3bENLMG1oTks5dXJEV2V3c0RjWnFSSWk2MVF5UXpIZGU5bDBJVWxUY0k4blB6SW1hNWY4MzF4VlhHcWk5OFdRWnBxZkhzZFBMMTR3d0FQNVVqc3p2RGUzRE92eDBlQVJob1NybThNTGozWTlvTjgyb00wWEJJYzZ1UncwS05wOGx1bkhNSUFMMmIzMFVMSmtYTUxMZEEvRks0S1MyTXZsdCtkTzN4K3RxS1VHWDR3cnhQdE5tV3Z2TEZLZlBwempMS0RsL0pBNmZCY0QyTEhjS1NETUs4Smdjb2tsM3R6STh6RzBSS3kzeURDcEErYzNDUDdwSURMQmIwZnBOempVQXRUUzcybWdBelJiRk5YY3ROMDV1ZWtZbVRoVTJaNzFNdlVDdzBKaXhONkc3RG1pT2UzY3A5a0EwMWYwUkJsTTc2ZjJ4NlltWjdYQ2RJMEpOUW04U3B5Y3RWWC8yU2JlZDBrYmpwT1YwNUNGRXRXV1lsQk8zb0hmN1NmMGpxWXJzM1NOOTk5TUhIQ2c0d2RzV1VKaUd1SUx5TUppK2dRcGhJRC9QZ2pEVzlxeExkMGtxSzFjQkxLeWJ3Z0JTY2R0NUtaanJUS1lXT1NUd3ZoNUZoRktWVndzQ01lT2gvK29qS1doWDZ1S2h3TU9RPSJdfQ.eyJhdWQiOlsiaHR0cHM6Ly9yaWEuZWUiLCJ1cm46Y2VydDpzaGEtMjU2OjZmMGRmMjQ0ZTRhODU2Yjk0YjNiM2I0NzU4MmEwYTUxYTMyZDY3NGRiYzcxMDcyMTFlZDIzZDRiZWM2ZDljNzIiXSwiZXhwIjoiMTU4Njg3MTE2OSIsImlhdCI6IjE1ODY4NzA4NjkiLCJpc3MiOiJ3ZWItZWlkIGFwcCB2MC45LjAtMS1nZTZlODlmYSIsIm5vbmNlIjoiMTIzNDU2NzgxMjM0NTY3ODEyMzQ1Njc4MTIzNDU2NzgiLCJzdWIiOiJKXHUwMGQ1RU9SRyxKQUFLLUtSSVNUSkFOLDM4MDAxMDg1NzE4In0";
100+
101+
//-----------------------------------------------------------------------------------------------------------------
102+
99103
public static String getUnsignedTokenString() {
100104
int sigPos = Tokens.SIGNED.lastIndexOf(".");
101105
return Tokens.SIGNED.substring(0, sigPos + 1);
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.webeid.security.validator;
2+
3+
import org.junit.jupiter.api.BeforeEach;
4+
import org.junit.jupiter.api.Test;
5+
import org.webeid.security.exceptions.UserCertificateDisallowedPolicyException;
6+
import org.webeid.security.testutil.AbstractTestWithMockedDateAndCorrectNonce;
7+
import org.webeid.security.testutil.Tokens;
8+
import org.webeid.security.validator.AuthTokenValidator;
9+
10+
import java.security.cert.CertificateException;
11+
12+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
13+
import static org.webeid.security.testutil.AuthTokenValidators.getAuthTokenValidatorWithDisallowedESTEIDPolicy;
14+
15+
class SubjectCertificatePolicyValidatorTest extends AbstractTestWithMockedDateAndCorrectNonce {
16+
17+
private AuthTokenValidator validator;
18+
19+
@BeforeEach
20+
void setUp() {
21+
try {
22+
validator = getAuthTokenValidatorWithDisallowedESTEIDPolicy(cache);
23+
} catch (CertificateException e) {
24+
throw new RuntimeException(e);
25+
}
26+
}
27+
28+
@Test
29+
void testX5cDisallowedPolicyCertificate() {
30+
// Tokens.SIGNED has EST IDEMIA policy which is configured as disallowed in setUp().
31+
assertThatThrownBy(() -> validator.validate(Tokens.SIGNED))
32+
.isInstanceOf(UserCertificateDisallowedPolicyException.class);
33+
}
34+
}

0 commit comments

Comments
 (0)