2

根据几篇文章,我发现现在可以使用 BouncyCastle 执行 CAdES,但几乎没有关于该主题的任何文档。

对于初学者,我想在具有基于文件的证书的文件上执行没有任何可选签名属性的 CAdES-BES。


针对皮屑:

我有一些可能有用的东西,你有你的 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));

我想就是这样。

这是我获得 signin-certificate 属性的方式


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));
}

希望能帮助到你

4

2 回答 2

3

CAdES 是 CMS(又名 PKCS7)的扩展,可以与 BouncyCastle 一起使用。RFC5126包含 CAdES 签名所需的所有内容,此外,我建议在 ASN.1 上查找信息,因为大多数部分都以该格式描述。

我目前正在寻找您正在寻找的相同答案,并发现David Hook 的《用 Java 开始密码学》一书提供了您可能需要的大量详细信息。

于 2013-01-16T10:20:02.860 回答
3

有用的代码可以在“ https://joinup.ec.europa.eu/ ”上找到

看看CAdESProfileBES.java

有人在原来的 SD-Digital Signature Service 的 Fork 上放了同样的代码。

于 2015-03-11T13:59:39.853 回答