【问题标题】:What is the best way to generate Certificate Signing Request using AndroidKeyStoreProvider?使用 AndroidKeyStoreProvider 生成证书签名请求的最佳方法是什么?
【发布时间】:2023-03-15 20:47:01
【问题描述】:

我读过this article。

它说明了如何生成KeyPair,但没有指定如何根据生成的密钥生成证书签名请求。

根据我的研究,要在 Java 中生成 CSR,来自网络的示例通常使用包 sun.* 或 BouncyCastle 库。似乎没有办法使用标准java.security API 生成 CSR。我读了this,似乎也说了同样的话。

除了使用 BouncyCastle 我别无选择?很难想象 Android 开发者不考虑这种用法。

顺便说一下,文章还提到:

生成新的 PrivateKey 要求您还指定 自签名证书将具有的初始 X.509 属性。 您可以稍后将证书替换为证书 由证书颁发机构签署

假设我最终获得了由证书颁发机构签署的证书。我究竟应该怎么做才能“稍后更换证书”?

【问题讨论】:

  • 你好!你找到解决方案了吗?如果您分享如何在没有 Bouncy/SpongyCastle 的情况下生成 CSR 的材料,我将不胜感激

标签: java android certificate keystore csr


【解决方案1】:

在 Android 上创建 CSR 的最佳方法是使用 SpongyCastle,这是 BouncyCastle 的 Android 实现。 SpongyCastle 已经为您完成了很多繁重的工作,因此它会让您的生活更轻松。


我的实现很大程度上基于找到的答案 here,但使用 Android KeyStore 来确保安全性并使用 SpongyCastle 的 JcaContentSignerBuilder() 而不是自定义的 ContentSigner。

将 SpongyCastle 添加到您的 build.gradle 文件中:

compile 'com.madgag.spongycastle:core:1.51.0.0'
compile 'com.madgag.spongycastle:pkix:1.51.0.0'

在Android KeyStore中创建KeyPair:

KeyPairGenerator keyGen = KeyPairGenerator.getInstance(KeyProperties.KEY_ALGORITHM_RSA, "AndroidKeyStore"); // store the key in the Android KeyStore for security purposes
keyGen.initialize(new KeyGenParameterSpec.Builder(
                  "key1",
                  KeyProperties.PURPOSE_SIGN)
                  .setSignaturePaddings(KeyProperties.SIGNATURE_PADDING_RSA_PKCS1)
                  .setDigests(KeyProperties.DIGEST_SHA256,
                                KeyProperties.DIGEST_SHA384,
                                KeyProperties.DIGEST_SHA512)
                  .build()); // defaults to RSA 2048
KeyPair keyPair = keyGen.generateKeyPair();

使用上述密钥对创建 CSR:

private final static String CN_PATTERN = "CN=%s, O=Aralink, OU=OrgUnit";

//Create the certificate signing request (CSR) from private and public keys
public static PKCS10CertificationRequest generateCSR(KeyPair keyPair, String cn) throws IOException, OperatorCreationException {
        String principal = String.format(CN_PATTERN, cn);

        ContentSigner signer = new JcaContentSignerBuilder(DEFAULT_RSA_SIGNATURE_ALGORITHM).build(keyPair.getPrivate());

        PKCS10CertificationRequestBuilder csrBuilder = new JcaPKCS10CertificationRequestBuilder(
                new X500Name(principal), keyPair.getPublic());
        ExtensionsGenerator extensionsGenerator = new ExtensionsGenerator();
        extensionsGenerator.addExtension(Extension.basicConstraints, true, new BasicConstraints(
                true));
        csrBuilder.addAttribute(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest,
                extensionsGenerator.generate());
        PKCS10CertificationRequest csr = csrBuilder.build(signer);

        return csr;
    }
}

就是这样,现在您有一个PKCS10CertificationRequest,您可以将其发送到您的服务器。

【讨论】:

    【解决方案2】:

    关于在 android 手机上生成 CSR(证书签名请求),我认为使用 Spongycastle 相当简单。它是 Bouncycastle 的 android 端口。

    假设我最终获得了由证书颁发机构签署的证书。 我究竟应该怎么做才能“稍后更换证书”?

    一旦您获得了应该从 CA(证书颁发机构)获得的实际签名证书,您就不再需要您的 CSR;您应该只将签名的证书存储在手机上。在哪里保存它们 - 我想你可以得到帮助 here。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-17
      • 1970-01-01
      • 2017-12-18
      • 2020-09-15
      • 2017-07-13
      • 2020-03-10
      • 2021-02-25
      • 1970-01-01
      相关资源
      最近更新 更多