gpt4 book ai didi

java - 使用 Bouncy CaSTLe 签署 CSR

转载 作者:IT老高 更新时间:2023-10-28 21:05:52 24 4
gpt4 key购买 nike

我找不到任何描述如何使用 BC 签署 CSR 的代码/文档。作为输入,我有一个 CSR 作为字节数组,并希望获得 PEM 和/或 DER 格式的证书。

我已经走到这一步了

def signCSR(csrData:Array[Byte], ca:CACertificate, caPassword:String) = {
val csr = new PKCS10CertificationRequestHolder(csrData)
val spi = csr.getSubjectPublicKeyInfo

val ks = new java.security.spec.X509EncodedKeySpec(spi.getDEREncoded())
val kf = java.security.KeyFactory.getInstance("RSA")
val pk = kf.generatePublic(ks)

val (caCert, caPriv) = parsePKCS12(ca.pkcs12data, caPassword)

val fromDate : java.util.Date = new java.util.Date // FixMe
val toDate = fromDate // FixMe
val issuer = PrincipalUtil.getIssuerX509Principal(caCert)
val contentSigner = new JcaContentSignerBuilder("SHA256WithRSAEncryption").setProvider(BC).build(caPriv)
val serial = BigInt(CertSerialnumber.nextSerialNumber)
val certgen = new JcaX509v3CertificateBuilder(new X500Name(issuer.getName), serial.bigInteger, fromDate, toDate, csr.getSubject, pk)

我无法从证书生成器获取 get 以将其存储为 PEM 或 DER 格式。

还是我一起走错了路?

最佳答案

好吧......我一直在寻找做同样的事情,但对于我的生活,我不知道该怎么做。 API 都在讨论生成 key 对然后生成证书,而不是如何签署 CSR。不知何故,很偶然 - 这就是我发现的。

由于 PKCS10 代表(CSR)请求的格式,您首先需要将您的 CSR 放入 PKCS10Holder。然后,将其传递给 CertificateBuilder(因为不推荐使用 CertificateGenerator)。您传递它的方式是在持有人上调用 getSubject 。

这是代码(Java,请根据需要调整):

public static X509Certificate sign(PKCS10CertificationRequest inputCSR, PrivateKey caPrivate, KeyPair pair)
throws InvalidKeyException, NoSuchAlgorithmException,
NoSuchProviderException, SignatureException, IOException,
OperatorCreationException, CertificateException {

AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder()
.find("SHA1withRSA");
AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder()
.find(sigAlgId);

AsymmetricKeyParameter foo = PrivateKeyFactory.createKey(caPrivate
.getEncoded());
SubjectPublicKeyInfo keyInfo = SubjectPublicKeyInfo.getInstance(pair
.getPublic().getEncoded());

PKCS10CertificationRequestHolder pk10Holder = new PKCS10CertificationRequestHolder(inputCSR);
//in newer version of BC such as 1.51, this is
//PKCS10CertificationRequest pk10Holder = new PKCS10CertificationRequest(inputCSR);

X509v3CertificateBuilder myCertificateGenerator = new X509v3CertificateBuilder(
new X500Name("CN=issuer"), new BigInteger("1"), new Date(
System.currentTimeMillis()), new Date(
System.currentTimeMillis() + 30 * 365 * 24 * 60 * 60
* 1000), pk10Holder.getSubject(), keyInfo);

ContentSigner sigGen = new BcRSAContentSignerBuilder(sigAlgId, digAlgId)
.build(foo);

X509CertificateHolder holder = myCertificateGenerator.build(sigGen);
X509CertificateStructure eeX509CertificateStructure = holder.toASN1Structure();
//in newer version of BC such as 1.51, this is
//org.spongycastle.asn1.x509.Certificate eeX509CertificateStructure = holder.toASN1Structure();

CertificateFactory cf = CertificateFactory.getInstance("X.509", "BC");

// Read Certificate
InputStream is1 = new ByteArrayInputStream(eeX509CertificateStructure.getEncoded());
X509Certificate theCert = (X509Certificate) cf.generateCertificate(is1);
is1.close();
return theCert;
//return null;
}

如您所见,我在此方法之外生成了请求,但将其传入。然后,我让 PKCS10CertificationRequestHolder 接受它作为构造函数 arg。

接下来,在 X509v3CertificateBuilder 参数中,您将看到 pk10Holder.getSubject - 这显然就是您所需要的?如果有什么遗漏也请告诉我!!!它对我有用。我正确生成的证书有我需要的 DN 信息。

维基百科有一个关于 PKCS 的 killer 部分 - http://en.wikipedia.org/wiki/PKCS

关于java - 使用 Bouncy CaSTLe 签署 CSR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7230330/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com