JAX-WS Metro,如何使用无效字符/签名不匹配来拦截正确的加密/签名消息

时间:2019-05-14 16:29:38

标签: soap jax-ws ws-security wsit

我的问题与this one

我花了数周的时间去尝试解决它,但是除了上述问题的解决方案(似乎是一个可怕的解决方法)外,似乎没有一个值得一提的解决方案,但是确实存在周围没有其他东西。

我们正在尝试与具有已建立且正在运行的Web服务的旧系统进行通信,并在其WSDL中声明了某些WS-Security约束。我们无法更改服务器上的任何内容,我们只需要按其出价进行操作即可。我们还有一个第三方客户端实现,该实现实际上可以与服务器进行通信并与之通信,因此我们知道该通信有效-使用该特定客户端。现在,我们要自己做。

以上WS-Security策略包括加密和签名。有以下几种方案:

  • 编写我们自己的代码以进行加密/解密和签名/验证
  • 使用一种现成的JAX-WS实现为我们完成上述任务

第二种选择当然是我们试图做的。然后,我们分为以下几类:

  • 地铁/ WSIT
  • Apache CXF

网络上的每个人都建议使用后一种方法(我也尝试过)-但是暂时我还是选择了第一种方法(特别是因为我们没有与Spring进行任何集成以利用CXF与之的良好集成)

在经过一些模棱两可的文档和各种向导(NetBeans)的困扰之后,我们得出了一个解决方案,该解决方案包含很少的自定义代码,带有一些密钥库的配置文件以及从wsimport实用程序生成的通常的代码。

一些时间过去了,它包括转储XML SOAP请求和响应,将我们产生的失败请求与来自第三方客户端的成功请求和响应进行比较。很多痛苦,没有结果-消息有所不同,但是核心逻辑和结构还可以-那么-您实际上无法比较加密部分。一段时间后,我遇到了一个客户端,该客户端发送了一些东西,实际上收到了一些东西,但是未能解密响应。

实际上,它已经解密,但是签名摘要验证失败。值得一提的是,原始XML消息包含一个“&”字符以及多个换行符。即SOAP消息的有效负载在语法上不是正确的XML。无论如何。

似乎此摘要验证深深植根于Metro / WSIT堆栈中,并且绝对没有办法找到截取和更正该摘要(或实际上是计算摘要的内容)的方法-显然,问题是在摘要计算之后或之前对某些特殊字符进行了翻译或规范化,并且我们(而不是我试图用来保持双手清洁的基础实现)所做的事情与Web服务的服务器端有所不同。

即使是地铁管(名称很不错,但文档却极为匮乏-这些天似乎没人在使用Metro / WSIT-或者,我应该说,没有人使用这种安全级别的SOAP或SOAP?-当我尝试使用Apache时) CXF,生成的SOAP消息在外观上看似相似),并且它们拦截消息的方式似乎也无济于事-尝试获取消息的原始内容时,没有提供的方法(Packet.getMessage()。writeTo ...-和其他变体)实际上可以绕开摘要验证的内容-因为他们都试图以StAX方式,流式传输等方式读取内容(调用StreamingPayLoadDigester.accept总是失败)

但是希望最终会消逝,我会一次又一次地尝试找到一些晦涩难懂的,没有记载的魔术来使我的东西起作用。好的,我要称呼它为一天,然后深入研究Java加密-直到找到上述问题为止。实际上,它会在引发摘要不匹配异常之前,利用规范化的解密消息“利用”从Metro代码深处(实际上是从wssx-impl开始)打印的日志消息。值得庆幸的是,此消息使用java.util.logging进行打印,并且可以通过多种方式截获-例如将其发送到某种同步队列中,以供客户端使用。啊。如果有人有更好的主意,请写下您的想法。

谢谢大家。

1 个答案:

答案 0 :(得分:0)

最后,我求助于重建在GitHub上找到的Metro / WSIT版本2.1.1,注释了WS-SX实施项目中的一行(ws-sx \ wssx-impl ... \ StreamingPayloadDigester.java:145)

help(reddit.submission)
Help on method submission in module praw.reddit:

submission(id=None, url=None) method of praw.reddit.Reddit instance
    Return a lazy instance of :class:`~.Submission`.

    :param id: A reddit base36 submission ID, e.g., ``2gmzqe``.
    :param url: A URL supported by
        :meth:`~praw.models.Submission.id_from_url`.`.

    Either ``id`` or ``url`` can be provided, but not both.

本可以以更好的方式完成,例如引入一个标志。

项目的顺序,从我进行更改的最小项目到我作为Metro实施包含在我自己的项目中的项目的顺序大致如下:

  1. WS-SX实现在->
  2. 中引用 在-> 中引用了
  3. WS-Security项目
  4. ->
  5. 中引用了Metro Web Services互操作性技术实现捆绑包(wsit-impl) 我的客户端中包含
  6. Metro Web服务运行时非OSGi捆绑包(webservices-rt)