/** * Liefert den Aussteller, insofern ermittelbar. * * @return der Aussteller. Wenn es sich um ein selbstsigniertes Zertifikat handelt, liefert die * Funktion NULL. * @throws Exception */ public Entry getIssuer() throws Exception { if (this.issuer != null || this.issuerChecked) return this.issuer; this.issuerChecked = true; X509Certificate x = this.getCertificate(); X500Principal issuer = x.getIssuerX500Principal(); // brauchmer gar nicht erst anfangen zu suchen if (issuer == null) return null; // selbstsigniert if (issuer.equals(x.getSubjectX500Principal())) return null; byte[] issuerSig = x.getExtensionValue(Extension.authorityKeyIdentifier.getId()); List<Entry> all = this.store.getEntries(); // wenn die Signatur des Ausstellers bekannt ist, suchen wir anhand // der. Das ist die zuverlaessigste Methode. if (issuerSig != null && issuerSig.length > 0) { for (Entry e : all) { if (CHECK_CA && !e.isCA()) continue; // OK, wir haben die Signatur des Ausstellers. Mal schauen, // ob wir sie im Keystore finden. byte[] test = e.getCertificate().getPublicKey().getEncoded(); if (Arrays.equals(issuerSig, test)) { this.issuer = e; return e; // gefunden } } } // Wir haben die Signatur nicht, stimmt vielleicht einen passenden DN? for (Entry e : all) { if (CHECK_CA && !e.isCA()) continue; X500Principal subject = e.getCertificate().getSubjectX500Principal(); if (subject.equals(issuer)) { this.issuer = e; return e; } } // nichts gefunden return null; }