22

我正在尝试使用 WS-UsernameToken 规范对 SOAP 请求进行身份验证,但目标设备始终拒绝访问。我的非工作请求看起来像这样。(我试图散列的密码是system。)

<?xml version="1.0" encoding="UTF-8"?>
<Envelope xmlns="http://www.w3.org/2003/05/soap-envelope">
 <Header>
  <Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
    <UsernameToken>
      <Username>root</Username>
      <Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">EVpXS/7yc/vDo+ZyIg+cc0fWdMA=</Password>
      <Nonce>tKUH8ab3Rokm4t6IAlgcdg9yaEw=</Nonce>
      <Created xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2010-08-10T10:52:42Z</Created>
    </UsernameToken>
  </Security>
 </Header>
  <Body>
    <SomeRequest xmlns="http://example.ns.com/foo/bar" />
  </Body>
</Envelope>

我正在寻找的是一个类似的请求示例,但具有实际有效的身份验证令牌。例如,如果您有使用这些令牌的 gSOAP 应用程序,并且可以生成请求并在此处发布结果,我将非常感激。

4

4 回答 4

19

核心是为命名空间定义前缀并使用它们来强化每个标签 - 您正在混合 3 个命名空间,而这只是通过尝试破解默认值而无法实现。准确使用标准 do c中使用的前缀也很好——以防另一方有点草率。

最后但并非最不重要的一点是,尽可能使用字段的默认类型要好得多 - 因此对于密码,您必须列出类型,对于 Nonce,它已经是 Base64。

确保在通过 XML 发送之前检查生成的令牌是否正确,并且不要忘记 wsse:Password 的内容是 Base64( SHA-1 (nonce + created + password) ) 和 wsu 中的日期时间: Created 很容易把你搞砸。因此,一旦您修复了前缀和命名空间并验证您的 SHA-1 在没有 XML 的情况下可以正常工作(想象一下您正在验证请求并进行 SHA-1 计算的服务器端),您还可以在没有 Created 甚至没有 Nonce 的情况下进行真正的操作。哦,Nonce 可以有不同的编码,所以如果你真的想强制使用另一种编码,你必须进一步研究 wsu 命名空间。

<S11:Envelope xmlns:S11="..." xmlns:wsse="..." xmlns:wsu= "...">
  <S11:Header>
  ...
    <wsse:Security>
      <wsse:UsernameToken>
        <wsse:Username>NNK</wsse:Username>
        <wsse:Password Type="...#PasswordDigest">weYI3nXd8LjMNVksCKFV8t3rgHh3Rw==</wsse:Password>
        <wsse:Nonce>WScqanjCEAC4mQoBE07sAQ==</wsse:Nonce>
        <wsu:Created>2003-07-16T01:24:32</wsu:Created>
      </wsse:UsernameToken>
    </wsse:Security>
  ...
  </S11:Header>
...
</S11:Envelope>
于 2010-08-24T12:15:00.440 回答
9

Metro 1.2 中的Hash Password Support 和 Token Assertion Parameters很好地解释了带有 Digest Password 的 UsernameToken 的样子:

摘要密码支持

WSS 1.1 用户名令牌配置文件允许在 SOAP 消息中发送摘要密码wsse:UsernameTokenwsse:UsernameToken在这种情况下 ,还包括另外两个可选元素 :wsse:Noncewsse:Created。随机数是发送者创建的随机值,用于包含在它发送的每个 UsernameToken 中。添加创建时间以将随机数组合到“新鲜”时间段。在这种情况下,密码摘要计算如下:

Password_Digest = Base64 ( SHA-1 ( nonce + created + password ) )

这是带有摘要密码的 UsernameToken 的样子:

<wsse:UsernameToken wsu:Id="uuid_faf0159a-6b13-4139-a6da-cb7b4100c10c">
   <wsse:Username>Alice</wsse:Username>
   <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">6S3P2EWNP3lQf+9VC3emNoT57oQ=</wsse:Password>
   <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">YF6j8V/CAqi+1nRsGLRbuZhi</wsse:Nonce>
   <wsu:Created>2008-04-28T10:02:11Z</wsu:Created>
</wsse:UsernameToken>
于 2010-08-23T01:19:49.310 回答
4

检查这个(密码应该是密码):

<wsse:UsernameToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="SecurityToken-6138db82-5a4c-4bf7-915f-af7a10d9ae96">
  <wsse:Username>user</wsse:Username>
  <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">CBb7a2itQDgxVkqYnFtggUxtuqk=</wsse:Password>
  <wsse:Nonce>5ABcqPZWb6ImI2E6tob8MQ==</wsse:Nonce>
  <wsu:Created>2010-06-08T07:26:50Z</wsu:Created>
</wsse:UsernameToken>
于 2010-08-17T21:30:15.687 回答
1

可能是这篇文章(Secure Metro JAX-WS UsernameToken Web Service with Signature, Encryption and TLS (SSL))提供了更多的见解。正如他们提到的“请记住,除非密码文本或摘要密码在安全通道上发送或令牌被加密,否则密码摘要和明文密码都不能提供真正的额外安全性。”

于 2013-05-23T03:58:18.540 回答