2012-12-03 29 views
2

根据几篇文章,我发现现在可以使用BouncyCastle来执行CAdES,但几乎没有关于该主题的任何文档。使用BouncyCastle使用JAVA标记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)); 

我认为就是这样。

这里是我得到的登入证书属性


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

希望它可以帮助

+0

感谢您提供的信息,您是否实施了“签署证书”(或签署证书-v2)签名属性?我在包含它时遇到了麻烦,您是否有任何特定的代码? – dande

+0

我在sha1的情况下使用签名证书,在其他地方使用签名证书-v2,我将添加一些代码 – Radius

+0

嗨,只是一个简短的问题,我无法得到我的头。你发送给时间戳服务器的数据是什么。我目前正在发送CMSignedData.getEncoded(),它显示签名上有一个时间戳,但它显示为无效:( – dande

回答

3

CADES是CMS(又名PKCS7),这是可能的BouncyCastle的做的扩展。 RFC5126包含CAdES签名所需的所有内容,同样,我建议在ASN.1上查找信息,因为大多数部分都以该格式描述。

我目前在寻找与您正在寻找的相同答案,并发现书Beginning Cryptography with Java by David Hook提供了许多您可能需要的详细信息。

+1

)我们已经开发了一个围绕BouncyCastle和第三方项目的包装,以使用CAdES-BES签署和验证文档/ CAdES-T/CAdES-C,它是为一个客户构建的,我们不打算将它作为开源发布(但无论如何),如果我需要任何帮助,请告知我。 – Radius

+0

@AndresSM:我最大的问题是,如何扩展CMS成为Cades-T,如果您有任何源代码片段,这将是一个巨大的帮助! – dande

+0

是的看看问题编辑中的代码 – Radius