Java 使用metro 2.3以编程方式从webservice读取加密的错误消息

Java 使用metro 2.3以编程方式从webservice读取加密的错误消息,java,ws-security,java-metro-framework,Java,Ws Security,Java Metro Framework,在具有WS-Security的Netbeans中使用METRO 2.3,我尝试读取加密Web服务的错误消息 在我的有效负载包含错误之前,通信工作正常。然后服务器发送一条加密的错误消息,其中包含出错的信息。我的客户端尝试对其进行解密,并了解到消息的结构与预期不同,并抛出XMLSignatureException: javax.xml.crypto.dsig.XMLSignatureException: WSS1717: Error occurred while doing digest veri

在具有WS-Security的Netbeans中使用METRO 2.3,我尝试读取加密Web服务的错误消息

在我的有效负载包含错误之前,通信工作正常。然后服务器发送一条加密的错误消息,其中包含出错的信息。我的客户端尝试对其进行解密,并了解到消息的结构与预期不同,并抛出XMLSignatureException:

javax.xml.crypto.dsig.XMLSignatureException: 
WSS1717: Error occurred while doing digest verification of body/payload
服务器发送的错误消息被隐藏

在第146行中抛出异常:

如果启用最佳日志记录级别,则可以读取第141行记录的信息


捕获异常时是否可以读取xml流的canonicalizedData?

由于似乎没有简单的方法可以做到这一点,我编写了一个解决方法

如果启用最高级日志记录,则会报告太多详细信息。所以我编写了自己的日志消息过滤器

Logger wsitlogger = Logger.getLogger("com.sun.xml.wss.logging.impl.opt.signature");
wsitlogger.setLevel(Level.FINEST);
TextAndLevelFilter logFilter= new TextAndLevelFilter(Level.INFO);
logFilter.addPrefix("WSS1764");
wsitlogger.setFilter(logFilter);
和我的TextLevelFilter.java:

public class TextAndLevelFilter implements Filter {
    private static final int offValue = Level.OFF.intValue();
    private final int levelValue;

    private final Collection<String> prefixes = new LinkedList<>();

    public TextAndLevelFilter(Level level) {
        this.levelValue = level.intValue();
    }

    public void addPrefix(String prefix) {
        prefixes.add(prefix);
    }

    @Override
    public boolean isLoggable(LogRecord record) {
        final String message = record.getMessage();
        for (String prefix : prefixes) {
            if (message.startsWith(prefix)) {
                return true;
            }
        }
        return record.getLevel().intValue() >= levelValue && levelValue != offValue;
    }
}
公共类TextAndLevelFilter实现过滤器{
私有静态final int offValue=Level.OFF.intValue();
私有最终整型值;
私有最终集合前缀=新LinkedList();
公共文本和级别筛选器(级别){
this.levelValue=level.intValue();
}
公共void addPrefix(字符串前缀){
前缀。添加(前缀);
}
@凌驾
公共布尔isLoggable(日志记录){
最终字符串消息=record.getMessage();
for(字符串前缀:前缀){
if(message.startsWith(前缀)){
返回true;
}
}
返回记录.getLevel().intValue()>=levelValue&&levelValue!=offValue;
}
}

这是一个可怕的解决办法,似乎是解决我长期困扰的问题的唯一办法:(