1

我需要生成“部分 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对象ReferencesTransforms并且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.

有什么线索可以帮助我吗?

4

0 回答 0