Obtenir des données REAL X.509 de certificat au format RFC1421
-
12-09-2019 - |
Question
Nous avons une application Java qui stocke les clés publiques RSA et permet à un utilisateur de chiffrer un flux à court d'informations avec l'une des clés. L'application permet également à l'utilisateur d'importer un nouveau certificat de clé dans le keystore. Lorsque nous charger le certificat d'un fichier, nous voulons utiliser le nom commun (CN) comme l'alias. Voici le problème:
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
Nous savons pertinemment que le nom du sujet dans le fichier a mélangé boîtier et nous devons préserver ce boîtier. Est-ce que quelqu'un sait comment obtenir plus flexible soutien X.509 de l'entreprise criminelle commune java6?
Nous avons pensé à utiliser l'API légère BouncyCastle, mais la documentation est presque inexistante.
EDIT: Utilisation 6u11 Voici JDK la liste des fournisseurs de sécurité 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
Le certificat:
-----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-----
La solution
Si vous voulez dire que vous êtes littéralement en utilisant l'opérateur d'identité (==
) pour tester, l'affirmation doit toujours échouer. Utilisez alias.equals ( "CN = CommonName, OU = ...") à la place.
Cependant, en supposant que n'est pas le problème, peut ajouter:
System.out.println(x509CertFact.getProvider());
System.out.println(alias);
aux points appropriés dans le code et d'afficher les résultats? Il pourrait se présenter plus de prospects. Affichage du certificat que vous chargez (dans le texte convivial format PEM) serait utile aussi, si elle ne divulgue aucune information d'identification personnelle.
Autres conseils
Essayez d'utiliser X500Principal # getName (String) pour obtenir le DN dans le format de votre choix. Ensuite, vous pouvez analyser le nom commun de cela.
Par ailleurs, si vous cartographiez un alias à un certificat réel que vous pouvez stocker le « alias » en majuscules (et l'interroger en majuscules), mais vous auriez encore le boîtier original du certificat cartographié
Impossible de reproduire l'erreur. Qu'est-ce que vous utilisez JCE? Nous utilisons de Java 5 et 6 JCE du Soleil et nous obtenons toujours le DN en cas d'origine.