Pregunta

Tenemos una aplicación Java que almacena claves públicas RSA y permite a un usuario para cifrar un corto flujo de información con cualquiera de las teclas. La aplicación también permite que el usuario importe un nuevo certificado de clave en el almacén de claves. Cuando cargamos el certificado de un archivo, queremos utilizar el nombre común (CN) como alias. Aquí está el problema:

CertificateFactory x509CertFact = CertificateFactory.getInstance("X.509");
X509Certificate cert = x509CertFact.generateCertificate(certificateInputStream);
String alias = cert.getSubjectX500Principal().getName();

assert alias.equals("CN=CommonName, OU=TestCo..."); // FAILS
assert alais.equals("cn=commonname, ou=testco..."); // PASSES

Sabemos que es un hecho de que el nombre del sujeto en el archivo ha mezclado carcasa y que necesitamos para preservar esa carcasa. ¿Alguien sabe cómo conseguir el apoyo X.509 más flexible de la JCE en java6?

Hemos pensado en el uso de la API de peso ligero BouncyCastle, pero la documentación es casi inexistente.

EDIT: Utilizando JDK 6u11 Aquí está la lista de los proveedores de seguridad de java.security:

security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=com.sun.net.ssl.internal.ssl.Provider
security.provider.4=com.sun.crypto.provider.SunJCE
security.provider.5=sun.security.jgss.SunProvider
security.provider.6=com.sun.security.sasl.Provider
security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.8=sun.security.smartcardio.SunPCSC
security.provider.9=sun.security.mscapi.SunMSCAPI
security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider

El certificado:

-----BEGIN CERTIFICATE-----
MIIDHjCCAtugAwIBAgIESnr4OzALBgcqhkjOOAQDBQAwcjELMAkGA1UEBhMCVVMxFTATBgNVBAoT
DEdlbWFsdG8gSW5jLjEnMCUGA1UECxMeU29sdXRpb25zIGFuZCBTcGVjaWFsIFByb2plY3RzMSMw
IQYDVQQDExpGUkJCTHVuYUNyeXB0b1NlcnZlci0xLjAuMDAeFw0wOTA4MDYxNTM1MjNaFw0wOTEx
MDQxNTM1MjNaMHIxCzAJBgNVBAYTAlVTMRUwEwYDVQQKEwxHZW1hbHRvIEluYy4xJzAlBgNVBAsT
HlNvbHV0aW9ucyBhbmQgU3BlY2lhbCBQcm9qZWN0czEjMCEGA1UEAxMaRlJCQkx1bmFDcnlwdG9T
ZXJ2ZXItMS4wLjAwggG3MIIBLAYHKoZIzjgEATCCAR8CgYEA/X9TgR11EilS30qcLuzk5/YRt1I8
70QAwx4/gLZRJmlFXUAiUftZPY1Y+r/F9bow9subVWzXgTuAHTRv8mZgt2uZUKWkn5/oBHsQIsJP
u6nX/rfGG/g7V+fGqKYVDwT7g/bTxR7DAjVUE1oWkTL2dfOuK2HXKu/yIgMZndFIAccCFQCXYFCP
FSMLzLKSuYKi64QL8Fgc9QKBgQD34aCF1ps93su8q1w2uFe5eZSvu/o66oL5V0wLPQeCZ1FZV466
1FlP5nEHEIGAtEkWcSPoTCgWE7fPCTKMyKbhPBZ6i1R8jSjgo64eK7OmdZFuo38L+iE1YvH7YnoB
JDvMpPG+qFGQiaiD3+Fa5Z8GkotmXoB7VSVkAUw7/s9JKgOBhAACgYBHBBVNzuoXgpPFPkSN71rI
MKkSIUAVE7iLagFCklCEvHlh1UxyRhCWNh/UazaJzHRZofWlVPRGmgtl+J6BJRJIDorPqt8FfifY
fpbAbCQctMToFF5QqggumOlJozXyfV9eyYyNn+Y4yZDr8JKq70WX/S2M+Oo1+SBJsXMTeDdfkDAL
BgcqhkjOOAQDBQADMAAwLQIUA+VcqEYMHwXdKY4XC+oO/zF/pRkCFQCDKAS5HpSMazbZgToEEYft
QFJSvw==
-----END CERTIFICATE-----
¿Fue útil?

Solución

Si usted quiere decir que usted está literalmente usando el operador de identidad (==) para poner a prueba, entonces la afirmación siempre debe fallar. Use alias.equals ( "CN = CommonName, OU = ...") en su lugar.

Sin embargo, en el supuesto de que no es el problema, se puede añadir:

System.out.println(x509CertFact.getProvider());
System.out.println(alias);

en los puntos apropiados en el código y publicar los resultados? Se podría aparecer más clientes potenciales. Publicar el certificado que va a cargar (en formato PEM-texto descriptivo) sería útil también, si no ha revelado ninguna información de identificación personal.

Otros consejos

Trate de usar X500Principal # getNombre (String) para obtener el DN en el formato de su elección. A continuación, puede analizar el nombre común de eso.

Por otra parte, si se aplica la relación de un alias para un certificado real podría almacenar el "alias" en todas las tapas (y consultarlo en mayúsculas), pero todavía tendría la carcasa original del certificado asignado

No se puede reproducir el error. JCE lo usas? Utilizamos JCE del Sol a partir de Java 5 y 6 y siempre nos dan el DN en el caso original.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top