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