根据几篇文章,我发现现在可以使用CAdES执行BouncyCastle,但是几乎没有关于这个主题的文档。
首先,我想在一个文件上执行CAdES,而不需要任何可选的签名属性,该文件具有基于文件的证书。
作为对皮屑的回应:
我有一些可能有用的东西,您有您的SignerInformation,您需要扩展它,首先您需要根据时间戳创建一个属性,我假设您已经有了一个TimeStampResponse作为tspResp
TimeStampToken token = tsresp.getTimeStampToken();
Attribute timeStamp = new Attribute(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken, new DERSet(ASN1Object.fromByteArray(token.getEncoded())));那么您需要扩展您的SignerInformation
AttributeTable unsigned = signerInformation.getUnsignedAttributes();
Hashtable<ASN1ObjectIdentifier, Attribute> unsignedAttrHash = null;
if (unsigned == null) {
unsignedAttrHash = new Hashtable<ASN1ObjectIdentifier, Attribute>();
} else {
unsignedAttrHash = signerInformation.getUnsignedAttributes().toHashtable();
}
unsignedAttrHash.put(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken, signatureTimeStamp);
SignerInformation newsi = SignerInformation.replaceUnsignedAttributes(si, new AttributeTable(
unsignedAttrHash));我想就是这样了。
下面是我如何获得签名证书属性的方法
Attribute signingCertificateAttribute;
MessageDigest dig = MessageDigest.getInstance(DigestAlgorithm().getName(),
new BouncyCastleProvider());
byte[] certHash = dig.digest(SigningCertificate().getEncoded());
if (DigestAlgorithm() == DigestAlgorithm.SHA1) {
SigningCertificate sc = new SigningCertificate(new ESSCertID(certHash));
signingCertificateAttribute = new Attribute(PKCSObjectIdentifiers.id_aa_signingCertificate, new DERSet(sc));
} else {
ESSCertIDv2 essCert = new ESSCertIDv2(new AlgorithmIdentifier(DigestAlgorithm().getOid()), certHash);
SigningCertificateV2 scv2 = new SigningCertificateV2(new ESSCertIDv2[] { essCert });
signingCertificateAttribute = new Attribute(PKCSObjectIdentifiers.id_aa_signingCertificateV2, new DERSet(scv2));
}希望它能帮上忙
发布于 2013-01-16 10:20:02
CAdES是CMS (又称PKCS7)的扩展,它可以通过BouncyCastle来实现。RFC5126包含了CAdES签名所需的一切,而且,我推荐在ASN.1上查找信息,因为大多数部分都是以这种格式描述的。
我目前正在寻找你正在寻找的同样的答案,并发现这本书大卫·胡克用Java开始密码学给出了很多你可能需要的详细信息。
发布于 2015-03-11 13:59:39
https://stackoverflow.com/questions/13675583
复制相似问题