我需要生成“部分 XML 签名”消息。
总而言之,当我们需要对一种 XML 文档进行签名时,我们会创建一个经过消化的“部分 XML 签名”消息,该“部分 XML 签名”消息被转发(带有一些凭据)到另一个负责对其进行签名的服务,然后返回它,最后我们提取此签名以将其注入原始消息中。
通常,“部分 XML 签名”消息如下所示:
<soap:Envelope xmlns:soap ="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<W3CComputeSignature xmlns="urn:swift:amh:xsd:signature">
<user>
<name> sign_ws_user </name>
<password>P@ssword01</ password>
</user>
< .... />
<signature><![CDATA[<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="_wwwwww">
<ds:Signature xmlns:ds ="http://www.w3.org/2000/09/xmldsig#" Id="_xxxxxx">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml exc c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig more#rsa sha256"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped signature"/>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml exc c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue > </ds:DigestValue>
</ds:Reference>
<ds:Reference>
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml exc c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue > </ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
</ds:Signature>
]]></signature>
</W3CComputeSignature>
</soap:Body>
</soap:Envelope>
我在获取此<ds:SignedInfo>
文件并生成文件时遇到了一些问题。我遵循了 Oracle 网站上的一些示例,例如https://www.oracle.com/technical-resources/articles/java/dig-signature-api.html
基于此示例,我可以使用 构建SignedInfo
对象References
,Transforms
并且Digest
我需要。但是我不明白如何在这一步之后调整代码。
在 Oracle 的网页中,他们创建密钥对以有效地签署文档。就我而言,我不需要签署文件!我的想法是保留此SignedInfo
对象并将其<ds:SignedInfo>
具体化为我将包装在<soap:Envelope><soap:Body>...<signature> CDATA
.
但是我没有找到合适的方法SignedInfo
来帮助我。我尝试使用,DOMSignedInfo
但我有一个 classcast Exception :
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
SignedInfo si = fac.newSignedInfo(.......);
DOMSignedInfo domSi = (DOMSignedInfo) si;
--> java.lang.ClassCastException: org.jcp.xml.dsig.internal.dom.DOMSignedInfo cannot be cast to org.apache.jcp.xml.dsig.internal.dom.DOMSignedInfo
而且我不确定我能用DOMSignedInfo
.
有什么线索可以帮助我吗?