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

使用java或BouncyCastle生成CSR而不使用私钥,java,cryptography,bouncycastle,hsm,Java,Cryptography,Bouncycastle,Hsm,希望在HSM(硬件安全模块)中生成私钥/公钥对时,使用java创建CSR文件 在Bouncy Castle中尝试示例时,CSR的生成需要私钥和公钥。由于密钥的生成是在HSM中进行的,因此我只有公钥和私钥假对象。 我可以在没有私钥的情况下用java生成CSR吗 请查找我正在尝试的代码示例 KeyPair pair = generateKeyPair(); PKCS10CertificationRequestBuilder p10Builder = new JcaPKCS10Certifi

希望在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非常陌生,任何输入或引用都会很有帮助。

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

使用这些密钥的方法是将它们提供给新生成的签名实例的
init
方法。然后,Java运行时将在正确的提供者(HSM的提供者)中搜索正确的
SignatureSpi
实现。这称为延迟提供程序选择,因为它仅在调用
init
方法后搜索实现。当然,在您的情况下,
ContentSigner
会在看不见的地方发生这些情况

私钥数据在任何时候都不应离开您的HSM,除非包装好以便在HSM之间进行备份或共享