Apache Camel是否可以帮助实现消息模糊器

时间:2018-07-11 17:58:00

标签: apache-camel

背景

我正在编写一个应用程序,其工作是“模糊”通过“服务总线”从一个“服务”发送到另一“服务”的消息。目的是评估服务总线和服务如何响应所发送的内容。服务总线在可以使用的传输和消息格式方面提供了一定的灵活性。服务总线实现是由其他方开发的,我无法访问该代码。

有一个标准化的XML模式,该模式定义了所有可能的消息类型。基本实现在ActiveMQ上使用XML,但其他选项也是可行的(例如TCP或UDP套接字,专有线路格式,DDS等)。

在这种情况下,模糊测试意味着我将用无效内容替换消息字段或属性的有效内容。该模式部分用于定义无效的内容。也可以使用其他更通用的无效值(例如,对于整数类型字段,值> Integer.MAX)。

我可以使用Apache Camel吗?

最近有人告诉我有关Apache Camel的信息,这可能会帮助我。我听说过骆驼,但从未使用过。我正在努力学习,但是很难找到可以为实际情况提供可理解的帮助的方案或示例。我已经使用Camel编写并测试了一些非常简单的程序,这些程序向我展示了如何轻松捕获信息。 顺便说一句,我没有使用Spring框架。

我需要执行以下操作:

read in a valid XML message instance
parse the XML
for each element/attribute
    determine a set of test cases based on type and schema restrictions
    for each test case
        send the message via service bus implementation
        intercept message sent from service bus [need to be able to handle different transports and wire formats]
        replace the original field content with the test content
        forward the message to the target test service

我认为骆驼可能在以下领域发挥作用:

  • 捕获通过服务总线发送的消息流量
  • 转发已修改的邮件

我需要帮助的是了解Camel的哪些功能可以用来帮助我-以及使用方法的实际示例。我已经成功地从ActiveMQ捕获了一条消息(以XML格式),并且从UDP套接字上捕获了同一条消息的专有二进制数据格式。捕获数据非常容易。

ActiveMQ示例(我很困惑)

作为使用ActiveMQ的一个示例,我正在努力将修改后的消息转发到目标。我不希望目标收到原始消息。

我是否需要设置某种代理以从模糊器捕获AMQ消息,对其进行修改,然后将其路由到AMQ端点?我能想到的唯一方法是尝试从配置为使用代理端口的模糊器中捕获TCP流量,执行模糊处理,然后通过ActiveMQ端口61616将其转发给AMQ主题。

类似于from("mina:tcp:localhost:<proxy_port>").process(fuzzerProcessor).to("jms:topic:<topic>"),其中为tcp://localhost:61616配置了ActiveMQ连接工厂。那有意义吗?我怀疑我会遇到很多问题,包括接收到的消息没有被“解码”为我提供XML的事实。我认为这只是从TCP套接字读取的原始字节。

我希望能够捕获ActiveMQ消息,以便可以访问XML内容,即from("jms:topic:<topic>")。但是,然后,如何将修改后的消息“放回AMQ流”中?

...

如果有人可以向我指出提示和技巧;完整且有据可查的文章,书籍或示例,甚至在我要尝试做的事情中,都非常有用。

更新 [美国东部时间2018年7月11日星期三17:11:06]

对于ActiveMQ用例,我已经通过执行以下操作成功实现了一定程度的成功:

ConnectionFactory amqCnxFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
context.addComponent("activemq", JmsComponent.jmsComponentAutoAcknowledge(amqCnxFactory));
...
  context.addRoutes(new RouteBuilder() {
    public void configure() {
      interceptSendToEndpoint("activemq:topic:ServiceStatus").process(interceptor);
      from("activemq:topic:ServiceStatus_SEND").to("activemq:topic:ServiceStatus");
    }
  });

服务总线配置允许指定其他主题名称,因此对于模糊器的服务总线配置,我将主题名称更改为ServiceStatus_SEND,而目标服务的配置仅使用了{{1} }。 我非常想找到一种替代方法来进行这项工作,而不必建立一堆“虚拟”主题。

拦截器逻辑做了非常基本的操作,将消息中的字符串值从我一直知道的位置更改为明显不同的内容。

它起作用了,但是至少有一个警告:当我尝试更改我知道在架构中定义为枚举的字段的情况下,并且当我用其他值替换有效值时,消息为通过,但是具有模糊枚举值的元素在目标接收到的消息中未表示。我不明白那里可能会发生什么。我不认为ActiveMQ对定义消息类型的XML模式有任何了解,但它忽略了无效的元素。这违背了我要去做的目的。

更新 [美国东部时间2018年7月11日星期三17:41:26]

在Wireshark中查看流量后,枚举值已设置为新的无效值。接收服务显然无效,因为它无效。再一次,Wireshark是我的朋友。 ;)

0 个答案:

没有答案