使用Java或BouncyCastle生成CSR,而不使用私钥

3

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

在尝试使用Bouncy Castle中的示例时,生成CSR需要私钥和公钥。由于密钥的生成发生在HSM中,因此我只有公钥私钥sham对象。我能否在没有私钥的情况下在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个回答

3
您可以生成证书签名请求(CSR)而不需要私钥的值。您确实需要引用私钥,并且该密钥必须能够签名。私钥的引用只是实现了PrivateKey类的特殊版本。它们不包含数据,只包含引用。但是调用getEncoded或检索RSA密钥的私有指数通常会失败(这可能取决于密钥生成参数和PKCS #11中间件)。
使用这些密钥的方法是仅将它们提供给新生成的Signature实例的init方法。然后,Java运行时将在正确的提供程序(用于您的HSM的提供程序)中搜索正确的SignatureSpi实现。这称为延迟提供程序选择,因为它仅在调用init方法后搜索实现。当然,在您的情况下,所有这些操作都将由ContentSigner自动完成。
私钥数据不应在任何时候离开您的HSM,除非备份或在多个HSM之间共享时进行封装。

感谢Maarten的回复。你说过"你确实需要一个私钥的引用,并且该密钥必须具备签名功能。对私钥的引用只是实现PrivateKey接口的特殊类的版本"。 你能解释一下在Java中如何实现吗? - mehrdad eilbeygi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接