1

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

// 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 不同了,我找不到原因……有人知道吗?

谢谢。

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

4

1 回答 1

0

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

于 2013-02-27T15:59:46.087 回答