Java xmldsig DigestValue(jsr105Provider apche,oracl)

时间:2014-04-30 13:01:32

标签: java apache web-services xml-dsig

我正在尝试实现一个java webservice客户端。肥皂消息已签名(内部分离签名)。

我有一个有效消息示例,验证为正确签名。

当我尝试使用我的代码时,邮件未正确签名。试图跟踪问题,我意识到问题(或我的错误)与其中一个引用的生成有关。

在正常工作的示例中,我可以验证'如何创建DigestValue:

<ds:Reference URI="#Id-4889213">
<ds:Transforms>
  <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
    <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList=""/>
  </ds:Transform>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>VYRVoWOIiZx/7QMavLyDmAZ3Mb0=</ds:DigestValue>

引用URI是消息Body:

<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-4889213">
<web:consultarEstados xmlns:web="https://webservice.face.gob.es"/>

如果我将规范化&#39;这个manualy,并尝试和apli sha1,我得到的结果正是DigestValue。

hand canonicalized soapenv:Body:

<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-4889213"><web:consultarEstados xmlns:web="https://webservice.face.gob.es"></web:consultarEstados></soapenv:Body>

生成sh1值的命令:(存储在bodyib.txt的previos字符串中,带有can。body)

cat bodyib.txt|openssl dgst -binary -sha1 | openssl enc -base64

输出:

VYRVoWOIiZx/7QMavLyDmAZ3Mb0= (Yes, the value in DigestValue !!)

当我签署我的消息时,我得到以下参考:

<ds:Reference URI="#Id-4889213">
<ds:Transforms>
    <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
    <InclusiveNamespaces xmlns="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList=""/>
    </ds:Transform>
    </ds:Transforms>
    <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
    <ds:DigestValue>sA5MIQPm4b2YhMRTPHg9CY8J1FI=</ds:DigestValue>
</ds:Reference>

我模仿所有名称空间和Id以获得与我的示例完全相同的soap消息。所以我得到了愚蠢的soapenv:身体:

<soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-4889213">

如果我手动标准化,我会得到与之前完全相同的字符串,但参考中显示的DigestValue不一样。

我尝试过两个不同的jsr105提供商:

Oracle:&#34; org.jcp.xml.dsig.internal.dom.XMLDSigRI&#34; Apcher santuario(1.5.6):&#34; org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI&#34;

结果是相同的摘要(根据我的例子,与我期望的摘要不同)。我不知道这些摘要来自哪里。当我尝试手动计算时,结果是示例中的结果。

我想我并没有得到这一切的概念,因为使用两个不同的库我得到了相同的价值,所以我不会遇到问题就是这个库的代码。

1 个答案:

答案 0 :(得分:2)

我发现要签署的数据有什么不同。该问题与http://www.w3.org/2001/10/xml-exc-c14n#变换算法有关。我不知道女巫是否正确:

我的例子中正在签署的竞争对手:

<soapenv:Body xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-4889213"><web:consultarEstados></web:consultarEstados></soapenv:Body>

我不知道为什么

<web:consultarEstados></web:consultarEstados> 

没有命名空间信息。

这可能是http://www.w3.org/2001/10/xml-exc-c14n#的org.apache.jcp.xml.dsig.internal.dom.XMLDSigRI实现中的错误,可能是元素为空时。

我会尽力找出来。

最终发现问题: 在签名之前,我正在做一些命名空间更改,试试我的例子。我要补充一下: soapEnvelope.getOwnerDocument()normalizeDocument();

使规范化正常工作。如果没有这个,规范化就行不通了。