CMS符号-OpenSSL生成的.zip.p7可通过zip工具提取,但不能由Java BouncyCastle提取。

问题描述 投票:1回答:1

我有一个使用BouncyCastle进行CMS签名的.zip文件

CMSSignedDataGenerator cmsGenerator = new CMSSignedDataGenerator();
ContentSigner contentSigner = new JcaContentSignerBuilder("SHA256withRSA").build(signingKey);
cmsGenerator.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(
        new JcaDigestCalculatorProviderBuilder()
        .setProvider("BC")
        .build()
    ).build(contentSigner, signingCertificate));
cmsGenerator.addCertificates(certs);

CMSSignedData cms = cmsGenerator.generate(data, true);
signedMessage = cms.getEncoded();
return signedMessage;

但是,以这种方式,生成的字节的zip条目不容易通过常规zip工具提取(需要额外的转换步骤),而如果使用OpenSSL,则可以将其提取:

openssl cms -sign -inkey key -signer key -nodetach -binary -in data.zip -out out.zip.p7 -outform DER

这里out.zip.p7可以通过zip工具解压缩,而在BouncyCastle的情况下,zip工具在解压缩时会给出“在zip文件的开头或内部额外增加70个字节。zip文件偏移不正确(本地标头sig):70” 。

使用BouncyCastle时,我在这里缺少什么?需要由OpenSSL生产的版本,因为在解压缩之前不需要PKCS7转换为zip。

顺便说一下,我正在使用Apache的commons-compress来生成zip文件。

java openssl bouncycastle sign
1个回答
1
投票

为了获得类似的输出,应将编码类型指定为“ DER”。

参考文档https://www.bouncycastle.org/docs/pkixdocs1.4/org/bouncycastle/cms/CMSSignedData.html#getEncoded(java.lang.String)

© www.soinside.com 2019 - 2024. All rights reserved.