【问题标题】:Convert PKCS10CertificationRequest to X509 certificate将 PKCS10CertificationRequest 转换为 X509 证书
【发布时间】:2015-07-21 06:10:44
【问题描述】:

我想知道是否可以使用 Bouncy Castle 将 PKCS10CertificationRequest 转换为 X509 证书?

类似于 openssl 中的 X509_REQ_to_X509。

这就是我创建请求的方式:

public static PKCS10CertificationRequest generateCSRFile(KeyPair keyPair, KeyUsage keyUsage) throws IOException, OperatorCreationException {
    String principal = "CA=" getCA();

    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.x509Certificate, extensionsGenerator.generate());
    PKCS10CertificationRequest csr = csrBuilder.build(signer);
    return csr;
}

【问题讨论】:

    标签: android bouncycastle x509 csr


    【解决方案1】:

    我远非 OpenSSL 专家,但根据我找到的一些文档:

    X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey) 创建一个 X509 证书,其主题和颁发者与 请求 r 中的主题,带有有效期,以及用于签名的 pkey (以 md5 作为摘要)。

    这是 Bouncycastle 的等价物:

    public X509Certificate x509ReqToX509(PKCS10CertificationRequest csr, int days, PrivateKey pKey) 
    {
      Date notBefore = new Date();
      Calendar cal = Calendar.getInstance();
      cal.add(Calendar.DATE, days);
      Date notAfter = cal.getTime();
      BigInteger serialNumber = generateCertSerialNumber(); // No implemented here
    
      X509V3CertificateGenerator certGen = new X509V3CertificateGenerator();
    
      certGen.setSerialNumber(serialNumber);
      certGen.setIssuerDN(csr.getCertificationRequestInfo().getSubject());
      certGen.setSubjectDN(csr.getCertificationRequestInfo().getSubject());
      certGen.setNotBefore(notBefore);
      certGen.setNotAfter(notAfter);
      certGen.setPublicKey(csr.getPublicKey());
      certGen.setSignatureAlgorithm("SHA256WithRSAEncryption");
    
      return certGen.generate(pKey, "BC");
    }
    

    注意:

    1. 我在签名算法中将 MD5 替换为 SHA-256。
    2. 根据证书目标,此短代码示例可能需要一些更新(例如,添加一些强制扩展)

    【讨论】:

    • 非常感谢!像魅力一样工作...... :)
    猜你喜欢
    • 2021-03-28
    • 1970-01-01
    • 2011-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多