我对签名/证书有点陌生,但是在检查了 Google + SO 之后,我找不到答案。我有为 PKCS #7 分离签名的文件生成签名的基本代码,到目前为止一切都很好......验证签名的客户端对生成的签名感到满意。我现在有一个新要求,包括使用 S/MIME 签名时间属性对原始文件进行签名的日期/时间。
到目前为止,我处理它的代码是:
final Attribute signingAttribute = new Attribute(CMSAttributes.signingTime, new DERSet(new DERUTCTime(new Date())));
signedAttributes.add(new Attribute(CMSAttributes.contentType, new DERSet(new ASN1ObjectIdentifier("1.2.840.113549.1.7.1"))));
signedAttributes.add(new Attribute(CMSAttributes.messageDigest, new DERSet(new DEROctetString(hash))));
signedAttributes.add(signingAttribute);
final AttributeTable signedAttributesTable = new AttributeTable(signedAttributes);
final DefaultSignedAttributeTableGenerator signedAttributeGenerator = new DefaultSignedAttributeTableGenerator(signedAttributesTable);
// now proceed for the signing process with BouncyCastle
final JcaSimpleSignerInfoGeneratorBuilder builder = new JcaSimpleSignerInfoGeneratorBuilder().setProvider("BC").setDirectSignature(true);
builder.setSignedAttributeGenerator(signedAttributeGenerator);
final SignerInfoGenerator signerGenerator = builder.build("SHA1withRSA", key, cert);
final CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
...
然后之后的代码与我用来生成签名的代码相同......但不起作用。
我不是真的一件事是messageDigest的哈希:
signedAttributes.add(new Attribute(CMSAttributes.messageDigest, new DERSet(new DEROctetString(hash))));
我得到的哈希生成为:
MessageDigest md = MessageDigest.getInstance("SHA1", "BC");
md.update(fileToSign.getBytes("UTF-8"));
hash = md.digest();
但我绝对不确定这是获取哈希的正确方法吗?以及生成 S/MIME 签名时间属性的整体方式......
欢迎任何关于我错过的提示或总体解释。