Android - 生成 PKCS#10 请求

标签 android ssl bouncycastle pkcs#12 pkcs#10

我正在尝试根据 PKCS#10 创建证书请求。 X509v3 Key Usage 应设置为:Digital Signature,Key Encipherment。

这是我到目前为止所发现的,但由于我使用最新的 bouncycaSTLe (1.52),因此不推荐使用 X509Extension.keyUsage。

public static PKCS10CertificationRequest generateCSRFile(KeyPair keyPair, KeyUsage keyUsage) throws IOException, OperatorCreationException {
    String principal = "CN=" + Utils.getCertificateCommonName() + ", O=" + Utils.getCertificateOrganization();
    AsymmetricKeyParameter privateKey = PrivateKeyFactory.createKey(keyPair.getPrivate().getEncoded());
    AlgorithmIdentifier signatureAlgorithm = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA1WITHRSA");
    AlgorithmIdentifier digestAlgorithm = new DefaultDigestAlgorithmIdentifierFinder().find("SHA-1");
    ContentSigner signer = new BcRSAContentSignerBuilder(signatureAlgorithm, digestAlgorithm).build(privateKey);

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

    return csr;
}

有没有其他方法可以添加KeyUsage?

基本上这就是我要实现的目标:

  1. 使用 PKCS#10 生成证书请求
  2. 从两个 key 对(数字签名 + key 加密和不可否认性)创建两个证书。
  3. 将证书请求中的私钥保存在 PKCS#12 中。

在密码学方面,我是个新手。

最佳答案

这对你有用吗? X509Extension 似乎可以用 Extension 代替。虽然不确定 Android 上下文。

public static PKCS10CertificationRequest generateCSRFile(KeyPair keyPair, KeyUsage keyUsage) throws IOException, OperatorCreationException {
    String principal = "CN=" + Utils.getCertificateCommonName() + ", O=" + Utils.getCertificateOrganization();
    AsymmetricKeyParameter privateKey = PrivateKeyFactory.createKey(keyPair.getPrivate().getEncoded());
    AlgorithmIdentifier signatureAlgorithm = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA1WITHRSA");
    AlgorithmIdentifier digestAlgorithm = new DefaultDigestAlgorithmIdentifierFinder().find("SHA-1");
    ContentSigner signer = new BcRSAContentSignerBuilder(signatureAlgorithm, digestAlgorithm).build(privateKey);

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

    return csr;
}

关于Android - 生成 PKCS#10 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29912382/

相关文章:

c - 如何使用基于 OpenSSL 的客户端提取预主 key ?

c - 如何以编程方式创建证书签名请求 (CSR)?

java - Bouncy CaSTLe - 如何使用 Bouncy CaSTLe 实现 SignedAndEnveloped 数据

c# - 使用 Bouncy CaSTLe 在 C# 中加密和使用 AES(EAX 模式)在 Python 中解密的问题

android - 如何确定 View 的当前方向(RTL/LTR)?

ios - 允许 NSBundle.mainBundle() 在 swift iOS 应用程序中查找 "der"格式的证书文件

android - 与 PendingIntent.getBroadcast() 有关的 Intrumented 测试

Java Bouncy CaSTLe OCSP 网址

java - SQLite 数据库不接受超过 1000 行?

android - 出于布局目的忽略 Android 软键盘