当在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很新,任何输入或参考都会有所帮助。
答案 0 :(得分:2)
您可以在不拥有私钥的值的情况下生成CSR。您确实需要对私钥的引用,并且密钥必须能够签名。对私钥的引用只是实现PrivateKey
的类的特殊版本。他们不包含数据,只是参考。但是,调用getEncoded
或检索RSA密钥的私有指数(通常 - 它可能取决于密钥生成参数和PKCS#11中间件)会因异常而失败。
这些密钥的使用方式是将它们提供给新生成的 init
实例的Signature
方法。然后,Java运行时将在正确的提供程序(HSM的实现)中搜索正确的SignatureSpi
实现。这称为延迟提供程序选择,因为它仅在调用init
方法后搜索实现。当然,在你的情况下,这一切都会在ContentSigner
之外发生。
私钥数据不应随时离开您的HSM,除非包装在HSM之间进行备份或共享。