Skip to content
This repository was archived by the owner on Jul 27, 2022. It is now read-only.

Commit 4af3fb0

Browse files
committed
Merge tag 'release-2.5.0' into develop
2 parents 6bc92a4 + c9fe8d7 commit 4af3fb0

File tree

1 file changed

+43
-2
lines changed

1 file changed

+43
-2
lines changed

src/main/java/ee/aktors/misp2/action/LoginAction.java

+43-2
Original file line numberDiff line numberDiff line change
@@ -45,19 +45,25 @@
4545
import org.apache.struts2.ServletActionContext;
4646
import org.apache.struts2.StrutsStatics;
4747
import org.apache.struts2.dispatcher.SessionMap;
48+
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
49+
import org.bouncycastle.asn1.x509.CertificatePolicies;
50+
import org.bouncycastle.asn1.x509.Extension;
51+
import org.bouncycastle.asn1.x509.PolicyInformation;
52+
import org.bouncycastle.cert.jcajce.JcaX509ExtensionUtils;
4853
import org.bouncycastle.util.encoders.Base64;
4954
import org.digidoc4j.CertificateValidator;
5055
import org.digidoc4j.CertificateValidatorBuilder;
5156

5257
import javax.security.auth.x500.X500Principal;
5358
import javax.servlet.http.HttpServletRequest;
5459
import java.io.ByteArrayInputStream;
60+
import java.io.IOException;
5561
import java.io.UnsupportedEncodingException;
5662
import java.security.NoSuchAlgorithmException;
5763
import java.security.cert.CertificateFactory;
58-
import java.security.cert.CertificateParsingException;
5964
import java.security.cert.X509Certificate;
6065
import java.util.*;
66+
import java.util.stream.Collectors;
6167

6268
import static org.apache.logging.log4j.Level.DEBUG;
6369

@@ -121,7 +127,7 @@ public String showLogin() {
121127
}
122128

123129
/**
124-
* @return ERROE if login fails, SUCCESS otherwise
130+
* @return ERROR if login fails, SUCCESS otherwise
125131
*/
126132
@HTTPMethods(methods = {HTTPMethod.POST})
127133
public String loginAdmin() {
@@ -442,6 +448,9 @@ private Boolean isCertificateValidForIDCardLogin(X509Certificate certificate) {
442448
);
443449
throw new RuntimeException("No trusted issuer in certificate:");
444450
}
451+
if (!hasValidIssuancePolicy(certificate)) {
452+
throw new RuntimeException("No trusted issuance policy found in certificate:");
453+
}
445454
} catch (Throwable throwable) {
446455
LOG.catching(DEBUG, throwable);
447456
LOG.warn(
@@ -454,6 +463,38 @@ private Boolean isCertificateValidForIDCardLogin(X509Certificate certificate) {
454463
return true;
455464
}
456465

466+
private Boolean hasValidIssuancePolicy( X509Certificate certificate) throws IOException {
467+
// https://github.com/SK-EID/smart-id-documentation/wiki/Secure-Implementation-Guide#only-accept-certificates-with-trusted-issuance-policy
468+
final String[] validIssuancePolicyOIDs = {
469+
"1.3.6.1.4.1.10015.1.1",
470+
"1.3.6.1.4.1.10015.1.2",
471+
"1.3.6.1.4.1.51361.1.1.1",
472+
"1.3.6.1.4.1.51361.1.1.2",
473+
"1.3.6.1.4.1.51361.1.1.3",
474+
"1.3.6.1.4.1.51361.1.1.4",
475+
"1.3.6.1.4.1.51361.1.1.5",
476+
"1.3.6.1.4.1.51361.1.1.6",
477+
"1.3.6.1.4.1.51361.1.1.7",
478+
"1.3.6.1.4.1.51455.1.1.1"
479+
};
480+
byte[] extensionValue = certificate.getExtensionValue(
481+
Extension.certificatePolicies.getId());
482+
Objects.requireNonNull(extensionValue, "No certificate policy extension found");
483+
LOG.debug("extensionvalue to parse:{}", extensionValue);
484+
CertificatePolicies policies = CertificatePolicies.getInstance(
485+
JcaX509ExtensionUtils.parseExtensionValue(extensionValue)
486+
);
487+
Objects.requireNonNull(policies, "Certificate policy extension value was empty");
488+
LOG.debug("policies found:{}", policies);
489+
Set<String> policyIds = Arrays.stream(policies.getPolicyInformation())
490+
.map(PolicyInformation::getPolicyIdentifier)
491+
.map(ASN1ObjectIdentifier::getId)
492+
.collect(Collectors.toSet());
493+
LOG.debug("policy OID's contained:{}", policyIds);
494+
return Arrays.stream(validIssuancePolicyOIDs)
495+
.anyMatch(policyIds::contains);
496+
}
497+
457498
private Map<String, String> parseSubjectDn(String dn) {
458499
Map<String, String> tmp = new HashMap<>();
459500

0 commit comments

Comments
 (0)