java - 使用 java 或 BouncyCaSTLe 生成 CSR,而不使用私钥

标签 java cryptography bouncycastle hsm

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

在 Bouncy CaSTLe 中尝试示例时,CSR 的生成需要私钥和公钥。由于 key 的生成发生在 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。您确实需要对私钥的引用,并且该 key 必须能够签名。对私钥的引用只是实现 PrivateKey 的类的特殊版本。它们不包含数据,仅包含引用。然而,调用 getEncoded 或检索 RSA key 的私有(private)指数(通常 - 它可能取决于 key 生成参数和 PKCS#11 中间件)会失败并出现异常。

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

私钥数据在任何时候都不应离开您的 HSM,除非打包用于备份或在 HSM 之间共享。

关于java - 使用 java 或 BouncyCaSTLe 生成 CSR,而不使用私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28366961/

相关文章:

java - 避免在工厂方法中使用 instanceof

node.js - TripleDes CBC Nodejs 实现问题

java - 需要帮助了解证书链

java - Spring MVC View 层的 JSP 替代方案

java - 如何根据复选框状态创建标签?

c# - 为什么 AES 解密器总是返回 16 个零(16 个字节)?

PHP gnupg_addsignkey 错误 : get_key failed

android - 与 Robolectric 一起运行时 Mockito 测试中的 SecurityProvider

java - 使用 BouncyCaSTLe 加密字符串的问题

java - 如何在 persistence.xml 中找到 "parameterize"JPA 数据库实例?