Obtener datos X.509 real de certificado con formato RFC1421
-
12-09-2019 - |
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-----
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.