保护 UsernameToken
一个基本的明文形式的 UsernameToken 并不能直接提供很强的安全性,因为用户名和相应的密码对于任何能够监视消息的人来说都是可见的。如果使用加密的通信通道,那么就可以解决这个问题 — 只要通道加密非常可靠,外部无法监视消息。WS-SecurityPolicy 方便地定义了一种方法来使用加密过的通道,如 清单 8 所示(同样,将一行代码分解为两行以匹配页面宽度 — 查看示例代码包的 secure-policy-server.xml 文件获得真实的策略):
清单 8. 要求 HTTPS 连接的策略
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<wsp:ExactlyOne>
<wsp:All>
<sp:TransportBinding xmlns:sp="http://schemas.xmlsoap.org/ws/2005/07/securitypolicy">
<wsp:Policy>
<sp:TransportToken>
<wsp:Policy>
<sp:HttpsToken RequireClientCertificate="false"/>
</wsp:Policy>
</sp:TransportToken>
</wsp:Policy>
</sp:TransportBinding>
<sp:SupportingTokens
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
<wsp:Policy>
<sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/
ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient"/>
</wsp:Policy>
</sp:SupportingTokens>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
清单 8 中使用粗体显示的代码是新增的部分,由
如果希望对服务使用一个 HTTPS 连接,这样做是可行的,但是首先需要配置您的 Web 服务器以支持 HTTPS。(Tomcat 提供了非常好的说明,可以从 /tomcat-docs/ssl-howto.html 访问)。还需要在 build.properties 中将 protocol 值修改为 https,并且如果对 Web 服务器使用的是自签名的证书,在运行 Ant test 目标时需要向客户机发送一个证书存储库(trust store)。提供的 build.xml 有一个注释掉的行可以实现这点,因此只需去掉此行的注释符号,并设置相应的证书存储库文件在系统中的位置。
另一种增强 UsernameToken 安全性的方法甚至可以处理未加密的链接。这种方法使用对一个字符串计算得到的摘要(digest)值,该字符串由两个文本值和密码组成。其中一个文本值为 nonce,是由发送者对每个请求生成的随机值。另一个文本值是一个生成的时间戳,表示发送者创建 UsernameToken 的时间。这两个值都以明文形式包含在 UsernameToken 中。如果恰当地应用于客户机和服务器,组合这些值和摘要中的密码使服务器能够验证在生成摘要时使用的是正确的密码,同时使得外部很难伪造有效的密码。清单 9 给出了一个使用摘要密码的策略示例,其后是实际捕获的使用摘要密码的消息(全部重新格式化以适合页面宽度 — 查找 hash-policy-client.xml 文件获得真实的策略),粗体显示的是与初始策略不同的地方。
清单 9. 使用密码摘要的策略和样例消息
"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<wsp:ExactlyOne>
<wsp:All>
<sp:SupportingTokens
xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200702">
<wsp:Policy>
<sp:UsernameToken sp:IncludeToken="http://docs.oasis-open.org/
ws-sx/ws-securitypolicy/200702/IncludeToken/AlwaysToRecipient">
<wsp:Policy>
<sp:HashPassword/>
</wsp:Policy>
</sp:UsernameToken>
</wsp:Policy>
</sp:SupportingTokens>
</wsp:All>
</wsp:ExactlyOne>
</wsp:Policy>
<?xml version='1.0' encoding='UTF-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<wsse:Security xmlns:wsse=".../oasis-200401-wss-wssecurity-secext-1.0.xsd"
soapenv:mustUnderstand="1">
<wsse:UsernameToken xmlns:wsu="...wss-wssecurity-utility-1.0.xsd"
wsu:Id="UsernameToken-1421876889">
<wsse:Username>libuser</wsse:Username>
<wsse:Password Type="...wss-username-token-profile-1.0#PasswordDigest"
>/Wt/2yDdZwa8a5qd7U70hrp29/w=</wsse:Password>
<wsse:Nonce>4ZQz5ytME/RXfChuKJ03iA==</wsse:Nonce>
<wsu:Created>2009-03-17T11:20:57.467Z</wsu:Created>
</wsse:UsernameToken>
</wsse:Security>
</soapenv:Header>
<soapenv:Body>
<ns2:getBooksByType xmlns:ns2="http://ws.sosnoski.com/library/wsdl">
<ns2:type>scifi</ns2:type>
</ns2:getBooksByType>
</soapenv:Body>
</soapenv:Envelope>