Get REAL X. 509-Daten aus RFC1421 formatiertes Zertifikat
-
12-09-2019 - |
Frage
Wir haben eine Java-Anwendung, die speichert öffentlichen RSA-Schlüssel und ermöglicht es einem Benutzer zu verschlüsseln eine kurz-stream von Informationen, die mit einem der Schlüssel.Die Anwendung ermöglicht auch die Benutzer zu importieren, ein neues key-Zertifikat in den keystore.Wenn wir laden Sie das Zertifikat aus einer Datei wollen wir mit dem gemeinsamen Namen (CN) als alias.Hier ist das problem:
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
Wir wissen, für eine Tatsache, dass das Thema Namen in die Datei hat gemischt Gehäuse und das müssen wir bewahren das Gehäuse.Weiß jemand, wie man mehr flexible X. 509 Unterstützung der JCE in Java6?
Wir haben gedacht, der mit den BouncyCastle lightweight-API, aber die Dokumentation ist fast nicht existent.
EDIT:Mit dem JDK 6u11 Hier ist die Liste der security-Anbieter aus java.Sicherheit:
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
Zertifikat:
-----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-----
Lösung
Wenn du meinst, dass Sie buchstäblich mit der identity-operator (==
), um zu testen, dann soll die Aussage immer fehl.Verwenden Sie alias.equals("CN=CommonName, OU=...") statt.
Jedoch, vorausgesetzt, das ist nicht das problem, hinzufügen können:
System.out.println(x509CertFact.getProvider());
System.out.println(alias);
an den entsprechenden stellen in den code und die Ergebnisse posten?Es kann bis mehr führt.Buchen Sie das Zertifikat, das Sie einlegen (in text-freundliche PEM-format) wäre ebenfalls hilfreich sein, wenn es nicht Offenlegung Ihrer persönlich identifizierbaren Informationen.
Andere Tipps
Versuchen Sie es mit X500Principal#getName(String) um den DN in das format Ihrer Wahl.Dann können Sie analysieren den gemeinsamen Namen aus.
Alternativ, wenn Sie eine Zuordnung eines alias zu einem eigentlichen Zertifikat, das Sie speichern könnte die "alias" in allen Kappen (und Abfragen es in all caps), aber Sie würden immer noch die original Gehäuse von der zugeordneten Zertifikat
Den Fehler reproduzieren können.Was JCE tun Sie verwenden?Wir nutzen die Sonnenenergie JCE von Java 5 und 6 und wir bekommen immer die DN in der ursprünglichen Fall.