我使用 xmlseclibs 尝试并签署SOAP文档,但它确实似乎没有东西规范化以同样的方式取决于我是否签署或确认。

我给你举个例子。这是我想签XML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" MajorVersion="1" MinorVersion="1" IssueInstant="2010-02-04T15:27:43Z" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester"/>
</samlp:Status>
</samlp:Response>
</soapenv:Body>
</soapenv:Envelope>

我得到了一些代码在PHP中使用工作公钥和私钥证书的组合来签署它,它似乎工作。它增加了<ds:Signature>元素与所有正确的东西,它看起来很棒。但后来我通过立即试图与xmlseclibs(和公钥证书)签署它,之后再对其进行验证测试,但验证失败。因此,完全相同的代码库是做两个签名和验证,但是这两个过程不同意的某些原因。

我添加了一些调试代码xmlseclibs找出它在做什么,我意识到,之所以签名密钥,它出现和确认键谈到了不同的,因为它在两种情况不同canonicalizes东西。当我告诉它签署<samlp:Response>元素,这是规范的形式,它(这里我添加新行以提高可读性)体征:

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester">
</samlp:StatusCode>
</samlp:Status>
</samlp:Response>

然而,当它进入验证签名,这是它计算来验证(在这里再次,我已经添加新行)的规范形式:

<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester">
</samlp:StatusCode>
</samlp:Status>
</samlp:Response>

因此,大家可以看到,这个版本忽略从xmlns:saml元素<samlp:Response>属性,而先不。 (注意,这是从xmlns:samlp属性,它是包含在这两个不同的)。这似乎很清楚像xmlseclibs的错误,但仍然是一个我很乐意来修复自己,如果我只知道它的规范形式是正确的一。如果该属性被排斥的规范化可以省略?还是应包括在内?哪一个是正确的独家规范形式?

有帮助吗?

解决方案

您不当创建DOM文档,并试图使用无效的内存树。无论是序列化和使用序列化结果或尝试登录前正确地创建在树中的命名空间声明。更多信息请参见错误报告: http://code.google。 COM / p / xmlseclibs /问题/细节?ID = 6

其他提示

也不是正确的规范形式!

签署XML有来自非命名空间属性后,命名空间声明,它打破了文档顺序规则:

  

命名空间节点具有比属性节点的文档顺序位置。

在验证XML完全缺少saml命名空间节点。仅仅因为没有引用它们的子内容Canonicalisation不会删除命名空间节点。它不仅能消除多余的命名空间节点(即那些已经在效果上的父命名空间)。

我不知道有足够的了解xmlseclibs说为什么发生这种情况,但它绝对错在这两方面。 FWIW我的DOM的C14N功能在这里说:

<samlp:Response xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:samlp="urn:oasis:names:tc:SAML:1.0:protocol" IssueInstant="2010-02-04T15:27:43Z" MajorVersion="1" MinorVersion="1" ResponseID="pfxe85313e6-e688-299a-df06-30f55e24f65a">
<samlp:Status>
<samlp:StatusCode Value="samlp:Requester"></samlp:StatusCode>
</samlp:Status>
</samlp:Response>

ETA:我只是看着在SVN xmlseclibs.php,而且也没有一个简单的办法解决这个作为它目前的做法基本上是错误的。它试图创建一个“canonicalised” DOM,然后用普通的旧saveXML()串行化它。由于有大约属性顺序C14N序列化规则和字符转义是saveXML不承诺遵循,也没有办法这可能可能工作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top