【问题标题】:Get REAL X.509 data from RFC1421 formatted certificate从 RFC1421 格式的证书中获取 REAL X.509 数据
【发布时间】:2009-08-10 21:45:57
【问题描述】:

我们有一个 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

证书:

-----开始证书----- 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 fpbAbC​​QctMToFF5QqggumOlJozXyfV9eyYyNn+Y4yZDr8JKq70WX/S2M+Oo1+SBJsXMTeDdfkDAL BgcqhkjOOAQDBQADMAAwLQIUA+VcqEYMHwXdKY4XC+oO/zF/pRkCFQCDKAS5HpSMazbZgToEEYft QFJSvw== -----结束证书-----

【问题讨论】:

  • 我也遇到了这个。 X500Principal 没有提供获取 DN 不同部分的方法,这很糟糕。我想解析 X500Principal.getName() 的结果是唯一的解决方案......

标签: java x509certificate bouncycastle jce


【解决方案1】:

尝试使用 X500Principal#getName(String) 以您选择的格式获取 DN。然后你可以从中解析出通用名称。

或者,如果您将别名映射到实际证书,您可以将“别名”存储为全部大写(并以全部大写形式进行查询),但您仍然可以使用映射证书的原始大小写

【讨论】:

    【解决方案2】:

    如果您的意思是您实际上是在使用身份运算符 (==) 进行测试,那么断言应该总是失败。请改用 alias.equals("CN=CommonName, OU=...")。

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

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

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

    【讨论】:

    • 你是对的,断言只是为了说明。另外,我将在原始问题中发布证书。谢谢。
    【解决方案3】:

    无法重现错误。你用什么JCE?我们使用来自 Java 5 和 6 的 Sun 的 JCE,并且我们总是得到原始情况下的 DN。

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 1970-01-01
      • 2021-02-12
      • 2017-08-01
      • 2018-02-06
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多