'Unprintable' characters in Distinguished Name causing comparison failure
-------------------------------------------------------------------------

                 Key: WSS-225
                 URL: https://issues.apache.org/jira/browse/WSS-225
             Project: WSS4J
          Issue Type: Bug
    Affects Versions: 1.5.8
         Environment: XP,  Java 1.6
            Reporter: Tom Trader
            Assignee: Ruchith Udayanga Fernando


Certain characters used in elements of a DN are considered unprintable as per 
RFC2252. The underscore '_' character is one of these characters. 

If the certificate is read from a java key store, and using the 
((X509Certificate) cert).getSubjectX500Principal() to obtain the X500Principal, 
and doing a getName(X500Principal.CANONICAL) on it I find that its common name 
has been hex encoded as follows:

cn=#14076d795f74657374

In the getAlias method of org.apache.ws.security.components.crypto.CryptoBase 
the equal method of X500Principal is used to compare certificates in a trust 
store against a given DN.

The canonical form of the DN is used in this comparison.

The problem is that the given DN X500Prinicpal object is created using the 
X500Principal(String DN) constructor. This object results in a canonical name 
that is not encoded. So the equal comparison fails as the cert from the 
keystore is encoded and the given one isn't.


Here's a suggested change that overcomes this problem:

private Vector getAlias(X500Principal subjectRDN, KeyStore store) throws 
WSSecurityException {
        // Store the aliases found
        Vector aliases = new Vector();
        Certificate cert = null;
        
        try {
            for (Enumeration e = store.aliases(); e.hasMoreElements();) {
                String alias = (String) e.nextElement();

                Certificate[] certs = store.getCertificateChain(alias);
                if (certs == null || certs.length == 0) {
                    // no cert chain, so lets check if getCertificate gives us 
a  result.
                    cert = store.getCertificate(alias);
                    if (cert == null) {
                        return null;
                    }
                    certs = new Certificate[]{cert};
                } else {
                    cert = certs[0];
                }
                if (cert instanceof X509Certificate) {
                    X500Principal foundRDN = ((X509Certificate) 
cert).getSubjectX500Principal();
                                        X500Principal foundRDNUnencoded = new 
X500Principal(foundRDN.getName(X500Principal.RFC1779));

                    if (subjectRDN.equals(foundRDNUnencoded)) {
                        aliases.add(alias);
                    }
                }
            }
        } catch (KeyStoreException e) {
            throw new WSSecurityException(
                WSSecurityException.FAILURE, "keystore", null, e
            );
        }
        return aliases;
    }


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to