【问题标题】:How to Create a Certificate on keystore to my KeyPair?如何在密钥库上为我的密钥对创建证书?
【发布时间】:2012-07-16 12:38:05
【问题描述】:

如何为我的 KeyPair 创建 X509Certificate? (我的班级已经有了 KeyPair,我需要创建一个证书来保存我的公钥,然后将其存储在密钥库中)。

我希望有一个 X509Certificate 构造函数能够接收我的公钥,然后通过 keystore.setEntry(pvtkey, cert) 将其存储,但我没有发现将新证书和我的密钥对关联起来没有任何用处...

有什么想法吗?

编辑: 我也尝试将证书链作为 null 传递,但它不起作用,它看起来像 http://bugs.sun.com/bugdatabase/view_bug.do;jsessionid=5866fda73ac1258fcfebef9c3234?bug_id=4906869 上报告的错误

谢谢!

【问题讨论】:

    标签: java security cryptography x509certificate key-pair


    【解决方案1】:

    Oracle Java 中没有用于创建 X509Certificate 的 Java 类。你要么必须

    1. 使用 keytool 程序(简单,但不是 java),或者
    2. 编写您自己的自定义代码(硬),
    3. 使用第三方库,如 bouncycastle(相对简单)。

    编辑:

    由于这些条目可以保留相当长的时间,我应该补充一点,上述陈述适用于 Java 7 及更早版本。

    【讨论】:

      【解决方案2】:

      这是一个与如何生成自签名 X509Certificate 的解决方案相关的问题: link

      尝试以这种方式使用 BouncyCastle 类:

      // generate a key pair
      KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA", "BC");
      keyPairGenerator.initialize(4096, new SecureRandom());
      KeyPair keyPair = keyPairGenerator.generateKeyPair();
      
      // build a certificate generator
      X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
      X500Principal dnName = new X500Principal("cn=Example_CN");
      
      // add some options
      certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()));
      certGen.setSubjectDN(new X509Name("dc=Example_Name"));
      certGen.setIssuerDN(dnName); // use the same
      // yesterday
      certGen.setNotBefore(new Date(System.currentTimeMillis() - 24 * 60 * 60 * 1000));
      // in 2 years
      certGen.setNotAfter(new Date(System.currentTimeMillis() + 2 * 365 * 24 * 60 * 60 * 1000));
      certGen.setPublicKey(keyPair.getPublic());
      certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");
      certGen.addExtension(X509Extensions.ExtendedKeyUsage, true, new ExtendedKeyUsage(KeyPurposeId.id_kp_timeStamping));
      
      // finally, sign the certificate with the private key of the same KeyPair
      X509Certificate cert = certGen.generate(keyPair.getPrivate(), "BC");
      

      记得添加安全提供者:

      Security.addProvider(new BouncyCastleProvider());
      

      【讨论】:

        猜你喜欢
        • 2013-12-21
        • 1970-01-01
        • 1970-01-01
        • 2017-02-05
        • 1970-01-01
        • 1970-01-01
        • 2020-11-18
        • 2016-01-17
        相关资源
        最近更新 更多