使用bouncycastle和SunMSCAPI创建外部(两步)签名

时间:2016-09-05 21:51:14

标签: java bouncycastle jce

我试图从我的应用程序中删除一些已弃用的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

这种令人费解的签名方式仅仅是因为我们需要签署摘要,我们没有可用于签名的完整内容,因此我必须将预先计算的摘要传递给签名方法。

任何人都可以帮我找出上述代码可能出现的问题吗?

提前致谢!

0 个答案:

没有答案