// Erzeuge ein CertPathBuilder-Objekt, das nach
// dem PKIX (RFC 3280) Algorithmen und Spezifika-
// tionen den Zertifikatspfad erzeugt und validiert.
CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX");

// Erzeuge die TrustAnchor-Objekte.
// In diesem Fall trauen wir nur einem Wurzel-CA Zertifikat.
TrustAnchor taRoot = new TrustAnchor(rootCert, null);
HashSet trustAnchors = new HashSet();
trustAnchors.add(taRoot);

// Erzeuge CertStore-Objekte, in denen der CertPathBuilder
// nach den passenden Zertifikaten und CRLs suchen kann.
// In diesem Fall stellen wir dieses in einer Collection,
// bestehend aus CA- und Endnutzer-Zertifikat, zusammen.
HashSet certsAndCRLs = new HashSet();
certsAndCRLs.add(caCert);
certsAndCRLs.add(userCert);
CollectionCertStoreParameters ccsp = new CollectionCertStoreParameters(certsAndCRLs);
CertStore store = CertStore.getInstance("Collection", ccsp);
pkixBuilderParameters.addCertStore(store);

// Erzeuge Parameter, die vom Zertifikatspfad erfllt sein
// mssen. Dazu gehren Attribute, die das Endnutzer-
// Zertifikat spezifizieren (hier z.B. der Subject-DN)
// und die Vertrauensanker.
X509CertSelector targetConstraints = new X509CertSelector();
targetConstraints.setSubject("CN=Endnutzer,C=DE");
PKIXBuilderParameters params = new PKIXBuilderParameters(trustAnchors, targetConstraints);

// Erzeuge den CertPath auf Basis der erstellten
// Parameter. Dabei wird zunchst das spezifizierte
// Endnutzer-Zertifikat in den angegebenen CertStores
// gesucht und anschlieend - ebenfalls anhand der in
// den CertStores enthaltenen Zertifikate - ein Pfad
// zu den TrustAnchors herzustellen versucht.
PKIXCertPathBuilderResult result = (PKIXCertPathBuilderResult) cpb.build(params);
CertPath cp = result.getCertPath();
