2012-06-03 18 views
5

Estoy usando la lib de Bouncycastle para generar certificados a partir de solicitudes PKCS10 utilizando la clase X509v3CertificateBuilder.Nombre distinguido X500Principal order

Devuelve crear un objeto X509CertificateHolder que contiene el certificado generado. Si llamo a getIssuer en el titular, devuelve el nombre completo del emisor en el orden correcto (lo mismo se devuelve si llamo a getSubjectX500Principal() en el certificado del emisor), si analizo la versión codificada del titular utilizando java CertificateFactory, el El método getIssuerX500Principal() del certificado generado devuelve el DN en el orden inverso, ¿qué ocurre?

Aquí es un código de ejemplo de lo que estoy tratando de hacer:

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 

Respuesta

4

Desde que necesita para comparar los nombres completos, resolví mediante el análisis del DN con la clase LdapName y la comparación de los RDN procesado:

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); 
}