充气城堡1.47和标准JCE

时间:2012-07-13 12:05:47

标签: java bouncycastle jce

我正在尝试创建一些辅助方法来创建(和签名)CSR,自签名证书等......我已经有了一些使用现已弃用的功能实现的方法。 为了跟上最新动态,我已将bouncycastle升级到1.47,这似乎有很大不同,我想知道两件事:

1)我似乎无法找到简明的示例列表。由于现在为完成类似的事情所需的代码的冗长,这将是非常受欢迎的。

2)在混合经典JCE的东西时,使用bouncycastle似乎是不合理的难度,至少比以前更多。有这个原因吗?

作为后者的一个例子,生成一个csr,过去就像这样简单:

org.bouncycastle.jce.PKCS10CertificationRequest request = new org.bouncycastle.jce.PKCS10CertificationRequest(type.toString(), subject, pair.getPublic(), null, pair.getPrivate());

当主题是“javax.security.auth.x500.X500Principal”时,私人&公钥源于一般的“java.security.KeyPair”等。

现在我有类似的东西:

public byte[] generatePKCS10(KeyPair pair, SignatureType type, X500Principal subject) throws IOException {
    PKCS10CertificationRequestBuilder builder = new PKCS10CertificationRequestBuilder(
        new X500Name(subject.getName()),
        SubjectPublicKeyInfo.getInstance(pair.getPublic())
    );
    AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find(type.toString());
    AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);
    AsymmetricKeyParameter keyParam = PrivateKeyFactory.createKey(pair.getPrivate().getEncoded());
    try {
        ContentSigner signer = new BcRSAContentSignerBuilder(sigAlgId, digAlgId).build(keyParam);
        PKCS10CertificationRequest csr = builder.build(signer);
        ContentVerifierProvider verifier = new JcaContentVerifierProviderBuilder().setProvider(new BouncyCastleProvider()).build(pair.getPublic());
        csr.isSignatureValid(verifier);
        return csr.getEncoded();
    }
    catch (OperatorCreationException e) {
        throw new IOException(e);
    }
    catch (PKCSException e) {
        throw new IOException(e);
    }
}

我是否缺少一大堆简单的转换实用程序或重载方法或特定于JCE的实现?许多谷歌搜索突出了旧的(阅读:弃用)做事方式,这无济于事。

1 个答案:

答案 0 :(得分:1)

我发布这个后不久就偶然发现了符合JCE标准的解决方案。看起来他们的很多类都有一个特定于JCA的扩展,它可以处理所有必要的转换。例如,“X509v1CertificateBuilder”可以实例化为“new JcaX509v1CertificateBuilder()”,它接受JCE参数而不是特定于bouncycastle的参数。

对于上面的示例:

PKCS10CertificationRequestBuilder builder = new JcaPKCS10CertificationRequestBuilder(
    subject,
    pair.getPublic()
);

我希望这种模式成立......