2012-06-03 12 views
5

Sto utilizzando la libreria Bouncycastle per generare certificati dalle richieste PKCS10 utilizzando la classe X509v3CertificateBuilder.X500Principal Distinguished Name order

Restituisce un oggetto X509CertificateHolder che contiene il certificato generato. Se chiamo getIssuer sul titolare, restituisce il nome distinto dell'emittente nell'ordine corretto (lo stesso restituito se chiamo getSubjectX500Principal() sul certificato emittente), se analizzo la versione codificata dal titolare utilizzando java CertificateFactory, il Il metodo getIssuerX500Principal() del certificato generato restituisce il DN nell'ordine opposto, cosa c'è che non va?

Ecco un codice di esempio di quello che sto cercando di fare:

X509CertificateHolder holder = certBuilder.build(sigGen); 
holder.getIssuer(); //Returns the DN in the correct order (same as in issuer cert) 

CertificateFactory certFactory = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(holder.getEncoded())); 

cert.getIssuerX500Principal().getName(); //Returns issuer DN in reverse order 

risposta

4

Da quando ho bisogno di confrontare nomi distinti, ho risolto analizzando il DN con classe di LdapName e confrontando i RDNs Filtrata:

boolean DNmatches(X500Principal p1, X500Principal p2) { 
    List<Rdn> rdn1 = new LdapName(p1.getName()).getRdns(); 
    List<Rdn> rdn2 = new LdapName(p2.getName()).getRdns(); 

    if(rdn1.size() != rdn2.size()) 
     return false; 

    return rdn1.containsAll(rdn2); 
}