将SignedDataObjects(并因此添加proofOfApproval属性)添加到封装签名

时间:2012-08-24 11:17:26

标签: xmlsec xades4j

我正在使用xades4j创建一个Enveloped签名:

Element elemToSign = doc.getDocumentElement();
XadesSigner signer = new XadesTSigningProfile(...).newSigner();
new Enveloped(signer).sign(elemToSign);

但我需要在签名中加入其他属性,如ProofOfApprova等......

我在xades4j示例中看到,使用不同的签名语句将proofOfApprovalProperties添加到封装签名中,例如:

AllDataObjsCommitmentTypeProperty globalCommitment = AllDataObjsCommitmentTypeProperty.proofOfApproval();
CommitmentTypeProperty commitment = CommitmentTypeProperty.proofOfCreation();

DataObjectDesc obj1 = new DataObjectReference('#' + elemToSign.getAttribute("Id"))
    .withTransform(new EnvelopedSignatureTransform())
    .withDataObjectFormat(new DataObjectFormatProperty("text/xml", "MyEncoding")
    .withDescription("Isto é uma descrição do elemento raiz")
    .withDocumentationUri("http://doc1.txt")
    .withDocumentationUri("http://doc2.txt"))
    .withIdentifier("http://elem.root"))
    .withCommitmentType(commitment)
    .withDataObjectTimeStamp(dataObjsTimeStamp)

SignedDataObjects dataObjs = new SignedDataObjects(obj1)
    .withCommitmentType(globalCommitment);

signer.sign(dataObjs, elemToSign);

我在这里看到另一个签名过程,更具体地说,我创建一个DataObjectreference的语句,说我使用“Id”属性根标签对我来说是不可用的,因为在输入中我可以有任何类型的xml文档我不知道什么样的属性(如果存在)我可以使用敌人定义根标记。

简单地说,我是否可以使用一些示例代码创建Enveloped签名并使用“new Enveloped(signer).sign(elemToSign);”或者知道xml源结构的白名单来放置一个proofOfApproval属性?

由于

微米。

1 个答案:

答案 0 :(得分:1)

proofOfApproval属性必须应用于被签名的数据对象,因此需要使用SignedDataObjects类。

Enveloped类只是简单方案的帮手。如果我理解正确,您想签署整个XML文档。 XML-Signatures规范定义了引用上的空URI(URI =“”)就是这个意思。如果您检查Enveloped类上的代码,您会看到它添加了一个带有空uri的 DataObjectReference

总结一下,你需要这样的东西:

DataObjectDesc obj1 = new DataObjectReference("")
    .withTransform(new EnvelopedSignatureTransform())
    .withCommitmentType(CommitmentTypeProperty.proofOfApproval());
signer.sign(new SignedDataObjects(obj1), elemToSign);