当我使用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不同了,我找不到原因......有没有人知道这件事?
感谢。
编辑:我一直在进行研究,问题来自于请求信封的主体在客户端和服务器之间的某处发生改变...我已经检查了客户端,我几乎确保身体没有改变。那些变化只出现在第二次调用中,仍然不知道为什么??答案 0 :(得分:0)
我终于找到了问题,我在客户端和服务器端使用的对象之间存在差异(不要问我为什么),当服务器端的传输层检索到它正在放置的enveloppe时正文中那些对象上的命名空间导致摘要检查在签名上失败。