使用java或BouncyCastle生成CSR而不使用私钥

时间:2015-02-06 13:34:09

标签: java cryptography bouncycastle hsm

当在HSM(硬件安全模块)中生成私钥/公钥对时,想要在java中创建CSR文件。

在尝试Bouncy Castle中的示例时,CSR的生成需要私钥和公钥。由于密钥的生成发生在HSM中,我只有公钥私钥假对象。 我可以在没有私钥的情况下在java中生成CSR吗?

请找到我正在尝试的代码示例。

 KeyPair pair = generateKeyPair();
    PKCS10CertificationRequestBuilder p10Builder = new JcaPKCS10CertificationRequestBuilder(
        new X500Principal("CN=Requested Test Certificate"), pair.getPublic());
    JcaContentSignerBuilder csBuilder = new JcaContentSignerBuilder("SHA256withRSA");
    ContentSigner signer = csBuilder.build(pair.getPrivate());
    PKCS10CertificationRequest csr = p10Builder.build(signer);

我对HSM很新,任何输入或参考都会有所帮助。

1 个答案:

答案 0 :(得分:2)

您可以在不拥有私钥的的情况下生成CSR。您确实需要对私钥的引用,并且密钥必须能够签名。对私钥的引用只是实现PrivateKey的类的特殊版本。他们不包含数据,只是参考。但是,调用getEncoded或检索RSA密钥的私有指数(通常 - 它可能取决于密钥生成参数和PKCS#11中间件)会因异常而失败。

这些密钥的使用方式是将它们提供给新生成的 init实例的Signature方法。然后,Java运行时将在正确的提供程序(HSM的实现)中搜索正确的SignatureSpi实现。这称为延迟提供程序选择,因为它仅在调用init方法后搜索实现。当然,在你的情况下,这一切都会在ContentSigner之外发生。

私钥数据不应随时离开您的HSM,除非包装在HSM之间进行备份或共享。