Java 从RFC1421格式化的证书获取真实的X.509数据

Java 从RFC1421格式化的证书获取真实的X.509数据,java,x509certificate,bouncycastle,jce,Java,X509certificate,Bouncycastle,Jce,我们有一个Java应用程序,它存储RSA公钥,并允许用户使用任何密钥加密短信息流。该应用程序还允许用户将新的密钥证书导入密钥库。从文件加载证书时,我们希望使用通用名(CN)作为别名。问题是: CertificateFactory x509CertFact = CertificateFactory.getInstance("X.509"); X509Certificate cert = x509CertFact.generateCertificate(certificateInputStream)

我们有一个Java应用程序,它存储RSA公钥,并允许用户使用任何密钥加密短信息流。该应用程序还允许用户将新的密钥证书导入密钥库。从文件加载证书时,我们希望使用通用名(CN)作为别名。问题是:

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
我们知道文件中的主题名有混合大小写,我们需要保留大小写。有人知道如何在Java6中从JCE获得更灵活的X.509支持吗

我们曾考虑过使用BouncyCastle轻量级API,但文档几乎不存在

编辑: 使用JDK 6u11,以下是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
证书:

-----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----- -----开始证书----- MiidhjccatugawaibagiesnR4OzalbgCqhkjooaqdbawcjelmakga1ebhmcvmxftagnvbaot DEDLWFSDG8GSW5JLJENMCUGA1ECXMEU29SDXRPB25 ZIGFUZCBTCGVJAWFSIFBYB2PLY3RZMSMW IQydvqdExpgukJCthvuyunyexB0B1NLCNZLCI0xLJAUMDAEFW0WOTA4MDYXNTM1MJNAFW0WOTEX MDQXNTM1MJNAMHIXCZAJBGNVBaytalVTMRUWEWYDVQKEWXHZW1HBHRVIELUYY4XJZALBNGNVBAST HLNVBHV0AW9UCYBHBMQGU3BLY2LHBCBQCM9QZWN0CZEJMCEGA1EAXMARLJCQKX1BMFDCNLWDG9T ZXJ2ZXITMS4WLJAWGG3MIIBLAYKOZJGEATCCAR8CGYEA/X9TgR11EilS30qcLuzk5/YRt1I8 70QAwx4/gLZRJmlFXUAiUftZPY1Y+r/F9BOW9SUBVZXGTUAHTRV8MZGT2UZUKWKN5/oBHsQIsJP u6nX/rfGG/g7V+fGqKYVDwT7g/btxr7dajvue1owktl2dfuk2hxku/yigmzndiaccfqcxyfcp FSMLzLKSuYKi64QL8Fgc9QKBgQD34aCF1ps93su8q1w2uFe5eZSvu/o66oL5V0wLPQeCZ1FZV466 1LP5NEHEIGATEKWCPOTCGWE7FPCTKMYKBHPBZ6I1R8JSJGO64EK7OMDZFUO38L+iE1YvH7YnoB JDvMpPG+qFGQiaiD3+Fa5Z8GkotmXoB7VSVkAUw7/S9JKGOBHAAACGYBHBBVNZUOXGPPFPKSN71RI MKKSIUAVE7ILAGFCECEVHLH1UXYRCHWNH/UAZAJZHRZFWLVPRGMGTL+J6BJRJIDorPqt8FfifY fpbAbCQctMToFF5QqggumOlJozXyfV9eyYyNn+Y4yZDr8JKq70WX/S2M+Oo1+SBJsXMTeDdfkDAL BgcqhkjOOAQDBQADMAAwLQIUA+VcqEYMHwXdKY4XC+oO/zF/PRKCFQCDKAS5HPSMAZGZGTOEYFT QFJSvw== -----结束证书-----
如果您的意思是您确实在使用identity操作符(
==
)进行测试,那么断言应该总是失败的。改用alias.equals(“CN=CommonName,OU=…”)

但是,假设这不是问题所在,可以添加:

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

在代码中的适当位置发布结果?它可能会找到更多的线索。发布您正在加载的证书(以文本友好的PEM格式)也会很有帮助,如果它不会泄露任何个人身份信息。

无法重现错误。你用什么JCE?我们使用Java 5和6中Sun的JCE,我们总是在原始情况下获取DN。

尝试使用以您选择的格式获取DN。然后,您可以从中解析出通用名称


或者,如果要将别名映射到实际证书,则可以将“别名”存储在所有CAP中(并在所有CAP中查询它),但仍然可以使用映射证书的原始大小写

如果正确,则断言仅用于说明。另外,我将在原始问题中发布证书。谢谢,我也碰到了这个。X500Principal没有提供方法来获取DN的不同部分,这很糟糕。我想解析X500Principal.getName()的结果是唯一的解决方案。。。