1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 package dk.sosi.seal.pki.impl.federationcert;
30
31 import dk.sosi.seal.pki.*;
32 import dk.sosi.seal.pki.internal.remote.LdapCertificateLoader;
33 import dk.sosi.seal.pki.internal.remote.RemoteCertificateLoader;
34 import dk.sosi.seal.pki.internal.store.CachingCertificateStore;
35 import dk.sosi.seal.pki.internal.store.CertificateStore;
36 import dk.sosi.seal.pki.internal.store.RemoteCertificateStore;
37
38 import java.security.cert.X509Certificate;
39 import java.util.HashMap;
40 import java.util.Map;
41
42 public class FederationCertificateStoreAdapter implements FederationCertificateResolver {
43 private final Map<String,CertificateStore> storesByOcesVersion = new HashMap<String,CertificateStore>();
44
45 public FederationCertificateStoreAdapter(SOSIConfiguration conf, CertificateCache cache) {
46 String hostName = conf.getLdapCertificateHostOCES1();
47 int portNumber = conf.getLdapCertificatePortOCES1();
48 RemoteCertificateLoader oces1Loader = new LdapCertificateLoader(hostName, portNumber);
49 CertificateStore oces1Store = new FederationCertifiacateCachingCertificateStore(oces1Loader, cache);
50 storesByOcesVersion.put(FederationCertificateReference.OCES1_VERSION, oces1Store);
51
52 }
53
54 public X509Certificate getFederationCertificate(FederationCertificateReference reference) {
55 CertificateStore store = storesByOcesVersion.get(reference.getOcesVersion());
56 if (store == null) {
57 throw new PKIException("OCES-version " + reference.getOcesVersion() + " is currently not supported.");
58 }
59 return store.getCertificate(reference.toString());
60 }
61
62 private static class FederationCertifiacateCachingCertificateStore extends CachingCertificateStore {
63 public FederationCertifiacateCachingCertificateStore(RemoteCertificateLoader oces1Loader, CertificateCache cache) {
64 super(new RemoteCertificateStore(oces1Loader), cache, CertificateCache.Category.FederationCert);
65 }
66
67 @Override
68 protected String getRemoteKey(String cacheKey) {
69 return new FederationCertificateReference(cacheKey).getSubjectSerialNumber();
70 }
71
72 @Override
73 protected void validate(String cacheKey, X509Certificate certificate) throws PKIException {
74 final String refSerialNumber = new FederationCertificateReference(cacheKey).getSerialNumber();
75 final String certSerialNumber = certificate.getSerialNumber().toString();
76 if ( ! refSerialNumber.equals(certSerialNumber)) {
77 throw new PKIException("Certificate lookup for reference '" + cacheKey + "' failed. Got certificate with serialnumber '" + certSerialNumber + "'");
78 }
79 }
80 }
81 }