两次调用Web服务时Wss4j和soaphandler错误

时间:2013-02-26 17:42:24

标签: java ws-security wss4j

当我使用wss4j验证服务器上SOAP请求的安全性时,我遇到了问题,这是我用来验证soap请求的安全头的代码部分(我在handleMessage方法中) SOAPHandler实现):

// get the crypto file to retrieve dedicated certificate
final Crypto iCertificateStore = WSKeystoreManagement.getCryptoFile();
final WSSecurityEngine iEngine = new WSSecurityEngine();
// Add the default config file to the engine
final WSSConfig iConfig = WSSConfig.getNewInstance();
iEngine.setWssConfig(iConfig);

try {

  // check security header
  final List<WSSecurityEngineResult> iSecurityParts =
    iEngine.processSecurityHeader(aDocument, null, null, iCertificateStore);


} catch (final WSSecurityException iException) { ...}

在请求上有一个签名和一个时间戳,当我第一次调用Web服务时,一切正常,请求被处理,我使用一个小的java项目来调用我的Web服务,程序检索答案并正确完成。但后来我再次启动程序,但这次在服务器端检查不起作用。我一直在查看wss4j代码以查看问题的来源,我已经到达DOMReference.validate方法,其中:

        if (validateContext == null) {
        throw new NullPointerException("validateContext cannot be null");
    }
    if (validated) {
        return validationStatus;
    }
    Data data = dereference(validateContext);
    calcDigestValue = transform(data, validateContext);

    if (log.isDebugEnabled()) {
        log.debug("Expected digest: " + Base64.encode(digestValue));
        log.debug("Actual digest: " + Base64.encode(calcDigestValue));
    }

这次calcDigestValue不同了,我找不到原因......有没有人知道这件事?

感谢。

编辑:我一直在进行研究,问题来自于请求信封的主体在客户端和服务器之间的某处发生改变...我已经检查了客户端,我几乎确保身体没有改变。那些变化只出现在第二次调用中,仍然不知道为什么??

1 个答案:

答案 0 :(得分:0)

我终于找到了问题,我在客户端和服务器端使用的对象之间存在差异(不要问我为什么),当服务器端的传输层检索到它正在放置的enveloppe时正文中那些对象上的命名空间导致摘要检查在签名上失败。