方法getCertChain()为一个证书返回有序的证书链。 MSCryptoFunctions MSF = new MSCryptoFunctions(); X509Certificate[] getCertChain( X509Certificate cert) {
try { getCACerts();
Principal subject = cert.getSubjectDN(); Principal issuer = cert.getIssuerDN(); CertChainList.add(cert);
// stop if issuer==subject (root CA) while (!(issuer.equals(subject))) {
match = false; X509CertSelector xcs = new X509CertSelector(); xcs.setCertificateValid(new Date());
Collection certcollection = CACerts.getCertificates(xcs);
// // the next 7 lines are inserted to work // around a problem with X509CertSelector. // we should be able to do this with // xcs.setSubject(issuer.toString()); // Iterator iter = certcollection.iterator(); while ( iter.hasNext() ) { X509Certificate cacert = (X509Certificate) (iter.next()); if (!cacert.getSubjectDN().equals(issuer)) iter.remove(); }
issuerArray = new X509Certificate[ certcollection.size()]; issuerArray = (X509Certificate[]) certcollection.toArray(issuerArray);
for (int i=0; i<\<>issuerArray.length; i++) if (verifySignature(issuerArray[i], cert)){ match = true; cert = issuerArray[i]; subject = cert.getSubjectDN(); issuer = cert.getIssuerDN(); CertChainList.add(cert); break; } if (!match) { return null; // cert chain broken } } } catch (Exception e) { e.printStackTrace(); }
X509Certificate[] CertChain = new X509Certificate[CertChainList.size()]; CertChainList.toArray(CertChain);
return CertChain; } |