gpt4 book ai didi

java - 在 Java 中使用充气城堡对文件进行签名

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:27:17 25 4
gpt4 key购买 nike

我想在 java 中使用证书对文件内容进行签名。

使用终端和 openssl,我可以这样做:

openssl smime -sign -in nosign.mobileconfig -out signed.mobileconfig -signer server.crt -inkey server.key -certfile cacert.crt -outform der -nodetach

server.crt 和 .key 是要签名的文件,我想我理解 cacert.crt 嵌入在输出内容中。

最后,我有一个已签名并受信任的文件。

在 Java 中,我不能使用 openssl(不想启动 openssl 命令)所以,我必须使用 lib 对其进行签名。

为此,我使用了 Bouncy CaSTLe(1.53 版)

这是我的代码:

    byte[] profile = ...; // I can have it also in String

// the certificate in -certfile
FileInputStream inputStream = new FileInputStream("src/main/resources/cacert.crt");

byte[] caCertificate = ByteStreams.toByteArray(inputStream);

// the certificate to sign : server.crt, embedded in p12
X509Certificate serverCertificate = (X509Certificate) this.keyStore.getCertificate("1");

// Private key is the server.key
ContentSigner sha1Signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider("BC").build(this.privateKey);

CMSSignedDataGenerator generator = new CMSSignedDataGenerator();
generator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(
new JcaDigestCalculatorProviderBuilder().setProvider("BC").build()).build(sha1Signer, serverCertificate));

// the embedded certificate : cacert.crt, but I don't know if it is good to do that this way
X509CertificateHolder holder = new X509CertificateHolder(caCertificate);

generator.addCertificate(holder);

CMSProcessableByteArray bytes = new CMSProcessableByteArray(profile);
CMSSignedData signedData = generator.generate(bytes, true);

System.out.println("signedData : \n" + signedData.getEncoded());

你能帮我得到好的签名数据吗?谢谢!

编辑:我有一个错误在

    X509CertificateHolder holder = new X509CertificateHolder(caCertificate);

java.io.IOException:遇到未知标记 13

最佳答案

CA 证书文件显然是PEM (ASCII) 格式。 X509CertificateHolder 的构造函数需要证书的 BER/DER(二进制)编码。

你可以通过添加这个来转换它:

PEMParser pemParser = new PEMParser(new FileReader("src/main/resources/cacert.crt"));
X509CertificateHolder caCertificate = (X509CertificateHolder) pemParser.readObject();

您还应该将签名证书添加到 CMS 结构中:

generator.addCertificate(new X509CertificateHolder(serverCertificate.getEncoded()));

关于java - 在 Java 中使用充气城堡对文件进行签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34175475/

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