我试图从我的应用程序中删除一些已弃用的BC代码,但是我在将旧的CMSSignedDataGenerator.addSigner切换到新API时出现问题。
我们在Linux(PKCS11提供程序)和Windows(SunMSCAPI)上运行的旧代码是这样的:
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
CertStore certStore = CertStore.getInstance("Collection",new CollectionCertStoreParameters(Arrays.asList(certChain)));
Attribute attrHash = new Attribute(CMSAttributes.messageDigest, new DERSet( new DEROctetString(hash) ) );
Attribute attrcontentType = new Attribute(CMSAttributes.contentType, new DERSet( CMSObjectIdentifiers.data ) );
ASN1EncodableVector v = new ASN1EncodableVector();
v.add(attrHash);
v.add(attrcontentType);
gen.addSigner(aPrivateKey, userCertificate, CMSSignedDataGenerator.DIGEST_SHA1, new AttributeTable(v), null);
gen.addCertificatesAndCRLs(certStore);
CMSSignedData s = gen.generate(CMSSignedDataGenerator.DATA, null, false, getProviderName() );
return s.getEncoded();
提供商名称将是" SunMSCAPI"或者我们在Linux上为PKCS#11动态使用的任何东西。
在BC省,addSigner和generate方法都被弃用了,所以现在我要做以下事情:
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
Store certStore = new JcaCertStore(Arrays.asList(certChain));
Attribute attrHash = new Attribute(CMSAttributes.messageDigest, new DERSet(new DEROctetString(hash)));
Attribute attrcontentType = new Attribute(CMSAttributes.contentType, new DERSet(CMSObjectIdentifiers.data));
ASN1EncodableVector v = new ASN1EncodableVector();
v.add(attrHash);
v.add(attrcontentType);
ContentSigner sha1Signer = new JcaContentSignerBuilder("SHA1withRSA").setProvider(provider).build(aPrivateKey);
gen.addSignerInfoGenerator(
new JcaSignerInfoGeneratorBuilder(new JcaDigestCalculatorProviderBuilder().setProvider(provider).build())
.setSignedAttributeGenerator(new DefaultSignedAttributeTableGenerator(new AttributeTable(v)))
.build(sha1Signer, userCertificate));
gen.addCertificates(certStore);
CMSSignedData s = gen.generate(new CMSAbsentContent(), false);
return s.getEncoded();
这个新代码的问题在于它使用" BC"作为提供商,但当我切换到" SunMSCAPI"我得到以下例外:
no such algorithm: SHA-1 for provider SunMSCAPI
这种令人费解的签名方式仅仅是因为我们需要签署摘要,我们没有可用于签名的完整内容,因此我必须将预先计算的摘要传递给签名方法。
任何人都可以帮我找出上述代码可能出现的问题吗?
提前致谢!