【问题标题】:Generate X509Certificate from byte[]?从 byte[] 生成 X509Certificate?
【发布时间】:2011-03-24 06:43:57
【问题描述】:

是否有可能从 byte[] 生成 java.security.cert.X509Certificate?

【问题讨论】:

    标签: java x509certificate


    【解决方案1】:

    当然。

    证书对象可以由CertificateFactory 的实例创建 - 特别是配置为创建 X509 证书的实例。可以这样创建:

    CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
    

    然后您需要向它传递一个包含证书字节的 InputStream。这可以通过将字节数组包装在 ByteArrayInputStream 中来实现:

    InputStream in = new ByteArrayInputStream(bytes);
    X509Certificate cert = (X509Certificate)certFactory.generateCertificate(in);
    

    【讨论】:

    • 感谢您的回答。但是我在最后一行收到“(java.security.cert.CertificateException)java.security.cert.CertificateException:无法解析证书:java.io.IOException:空输入”。 InputStream 不为空,但会抛出异常
    • 一开始我也发生了同样的事情,因为我没有仔细考虑我在做什么。在我的情况下,这是因为我试图使用来自密钥库的字节而不是密钥库中的证书来执行上述操作。从密钥库中提取证书,获取编码字节,然后处理这些是使上述答案对我有用的原因。
    • 在我的情况下,问题是 byte[] 是 base 64 编码的......错误消息是略微误导的“空输入”。也许它有时会帮助某人......
    • 受密码保护的 JKS 文件中的 bytes[] 怎么样?我们如何从中生成证书?
    【解决方案2】:
    InputStream stream = null;
    byte[] bencoded = javax.xml.bind.DatatypeConverter.parseBase64Binary(x509CertificateStr);
    
    try {
        CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
        cert = (X509Certificate) certFactory.generateCertificate(stream);
    
    } catch (java.security.cert.CertificateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    

    【讨论】:

    • 问题没有提到base-64,缺少stream的初始化。此代码将抛出 NullPointerException。
    【解决方案3】:

    你可以这样做:

    X509Certificate certificate = signature.getKeyInfo().getX509Datas().get(0).getX509Certificates().get(0);
    
    String lexicalXSDBase64Binary = certificate.getValue();
    byte[] decoded = DatatypeConverter.parseBase64Binary(lexicalXSDBase64Binary);
    
    
    CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
    Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(decoded));
    

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 2015-09-02
      • 2012-04-13
      • 2015-11-22
      • 2015-03-19
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 2015-07-27
      相关资源
      最近更新 更多