我正在尝试从服务器调用 ws-security 安全 Web 服务,但不幸的是,该服务器本身不支持此功能。我采用的方法是实现一个 .jsp,它充当实际端点 URL 的反向代理,在此过程中添加带有 ws-security 元素的元素。
这似乎工作得很好,我相信我已经使用正确的名称空间等正确地构建了 XML。我通过将 XML 与 SOAP-UI 生成的 XML 进行比较来验证这一点。
问题在于实现密码摘要生成器。我没有得到与 SOAP-UI 使用相同的 NOnce、xsd:dateTime 和密码输入以及以下代码相同的结果。
StringBuffer passwordDigestStr_ = new StringBuffer();
// First append the NOnce from the SOAP header
passwordDigestStr_.append(Base64.decode("PzlbwtWRpmFWjG0JRIRn7A=="));
// Then append the xsd:dateTime in UTC timezone
passwordDigestStr_.append("2012-06-09T18:41:03.640Z");
// Finally append the password/secret
passwordDigestStr_.append("password");
System.out.println("Generated password digest: " + new String(com.bea.xbean.util.Base64.encode(org.apache.commons.codec.digest.DigestUtils.sha(passwordDigestStr_.toString())), "UTF-8"));
我认为问题在于实现前两个元素的散列,如http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0.pdf所解释
请注意,nonce 使用其解码值的八位字节序列进行散列,而时间戳使用其在元素内容中指定的 UTF8 编码的八位字节序列进行散列。
如果有人能帮我解决这个问题,那就太好了,因为它开始让我发疯了!如果您可以提供源代码,那将是理想的。