Предоставление Websocket через WSO2 API Manager с помощью wss: // и далее - PullRequest
2 голосов
/ 07 июня 2019

Я пытаюсь открыть службу WebSocket через WSO2 API manager.У меня есть требование, чтобы все межмашинное взаимодействие было защищено, поэтому я хочу использовать зашифрованный WebSocket (wss: //).У меня есть веб-сервис для проверки концепции, который просто выдает одно сообщение в секунду.Это не встроенная реализация wss: //, но у меня есть обратный прокси (Apache) впереди на той же машине, которая в порядке.

Проблема

Это работает:

  • Я могу делать вызовы через wss: // к шлюзу, если разрешу шлюзу использовать ws: // для вызова действительной службы API.
  • Я могу делать звонки с компьютера шлюза на фактический компьютер службы API через wss: //

Это не так:

  • Но еслиЯ пытаюсь настроить шлюз для вызова через wss: //, затем я получаю исключение нулевого указателя в шлюзе.

Этот последний вопрос является проблемой.Я думаю, что это какая-то конфигурация в шлюзе, но не вижу что.Файл wso2carbon.log показывает:

TID: [-1] [] [2019-06-07 11:02:34,051] ERROR {org.apache.synapse.core.axis2.Axis2Sender} -  Unexpected error during sending message out {org.apache.synapse.core.axis2.Axis2Sender}
java.lang.NullPointerException
        at org.wso2.carbon.websocket.transport.WebsocketConnectionFactory.cacheNewConnection(WebsocketConnectionFactory.java:123)
        at org.wso2.carbon.websocket.transport.WebsocketConnectionFactory.getChannelHandler(WebsocketConnectionFactory.java:79)
        at org.wso2.carbon.websocket.transport.WebsocketTransportSender.sendMessage(WebsocketTransportSender.java:106)
        at org.apache.axis2.transport.base.AbstractTransportSender.invoke(AbstractTransportSender.java:112)
        at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:442)
        at org.apache.axis2.description.OutOnlyAxisOperationClient.executeImpl(OutOnlyAxisOperation.java:297)
        at org.apache.axis2.client.OperationClient.execute(OperationClient.java:149)
        at org.apache.synapse.core.axis2.Axis2FlexibleMEPClient.send(Axis2FlexibleMEPClient.java:592)
        at org.apache.synapse.core.axis2.Axis2Sender.sendOn(Axis2Sender.java:83)
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.send(Axis2SynapseEnvironment.java:548)
        at org.apache.synapse.endpoints.AbstractEndpoint.send(AbstractEndpoint.java:382)
        at org.apache.synapse.endpoints.AddressEndpoint.send(AddressEndpoint.java:65)
        at org.apache.synapse.mediators.builtin.SendMediator.mediate(SendMediator.java:121)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:97)
        at org.apache.synapse.mediators.AbstractListMediator.mediate(AbstractListMediator.java:59)
        at org.apache.synapse.mediators.base.SequenceMediator.mediate(SequenceMediator.java:158)
        at org.apache.synapse.core.axis2.Axis2SynapseEnvironment.injectMessage(Axis2SynapseEnvironment.java:1005)
        at org.wso2.carbon.inbound.endpoint.protocol.websocket.InboundWebsocketSourceHandler.injectToSequence(InboundWebsocketSourceHandler.java:469)
        at org.wso2.carbon.inbound.endpoint.protocol.websocket.InboundWebsocketSourceHandler.handleHandshake(InboundWebsocketSourceHandler.java:182)
        at org.wso2.carbon.inbound.endpoint.protocol.websocket.InboundWebsocketSourceHandler.channelRead(InboundWebsocketSourceHandler.java:131)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
        at org.wso2.carbon.apimgt.gateway.handlers.WebsocketInboundHandler.channelRead(WebsocketInboundHandler.java:125)
        at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:147)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
        at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
        at io.netty.handler.codec.MessageToMessageDecoder.channelRead(MessageToMessageDecoder.java:103)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
        at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:244)
        at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:147)
        at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:308)
        at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:294)
        at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:846)
        at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:131)
        at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
        at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
        at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
        at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:110)
        at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
        at java.lang.Thread.run(Thread.java:748)
TID: [-1] [] [2019-06-07 11:02:34,057]  WARN {org.apache.synapse.core.axis2.Axis2SynapseEnvironment} -  Executing fault handler due to exception encountered {org.apache.synapse.core.axis2.Axis2SynapseEnvironment}
TID: [-1] [] [2019-06-07 11:02:34,058]  WARN {org.apache.synapse.endpoints.EndpointContext} -  Endpoint : AnonymousEndpoint with address wss://icarcdevapi01.internal.carus.com/notifications/notifications will be marked SUSPENDED as it failed {org.apache.synapse.endpoints.EndpointContext}
TID: [-1] [] [2019-06-07 11:02:34,058]  WARN {org.apache.synapse.endpoints.EndpointContext} -  Suspending endpoint : AnonymousEndpoint with address wss://icarcdevapi01.internal.carus.com/notifications/notifications - last suspend duration was : 30000ms and current suspend duration is : 30000ms - Next retry after : Fri Jun 07 11:03:04 EEST 2019 {org.apache.synapse.endpoints.EndpointContext}
TID: [-1] [] [2019-06-07 11:02:34,058]  INFO {org.apache.synapse.mediators.builtin.LogMediator} -  STATUS = Executing default 'fault' sequence, ERROR_CODE = 0, ERROR_MESSAGE = Unexpected error during sending message out {org.apache.synapse.mediators.builtin.LogMediator}
TID: [-1] [] [2019-06-07 11:02:34,123]  INFO {org.apache.synapse.mediators.builtin.LogMediator} -  STATUS = Executing default 'fault' sequence, ERROR_CODE = 303001, ERROR_MESSAGE = Currently , Address endpoint : [ Name : AnonymousEndpoint ] [ State : SUSPENDED ] {org.apache.synapse.mediators.builtin.LogMediator}

Дополнительные сведения

Я добавил следующее в репозиторий / conf / axis2 / axis2.xml рядом с transportSender для ws:

<transportSender name="wss" class="org.wso2.carbon.websocket.transport.WebsocketTransportSender">
    <parameter name="ws.outflow.dispatch.sequence" locked="false">outflowDispatchSeq</parameter>
    <parameter name="ws.outflow.dispatch.fault.sequence" locked="false">outflowFaultSeq</parameter>
    <parameter name="ws.trust.store" locked="false">
        <ws.trust.store.location>repository/resources/security/client-truststore.jks</ws.trust.store.location>
    <ws.trust.store.Password>wso2carbon</ws.trust.store.Password>
</parameter>

Обратный прокси-сервер шлюза включает в себя:

  RewriteEngine On

  RewriteCond %{HTTP:Upgrade} websocket [NC]
  RewriteCond %{HTTP:Connection} upgrade [NC]
  RewriteRule /(.*) ws://127.0.0.1:9099/$1 [P,L]

, который отображает все соединения через веб-сокет с портом 9099. Я полагаю, поскольку proxy-> wso2over ws: // Мне не нужен другой порт.

Если я настраиваю API в WSO2 Publisher, указывая на мой сервис напрямую (ws://myservice.example.com:8001/foo), тогда он работает.Я могу вызвать wss: // к шлюзу, но он вызывает через API незашифрованный ws: // on.У меня также есть обратный прокси-сервер на реальной машине службы API.Если я запускаю свой тестовый клиент на компьютере шлюза API и вызываю wss://myservice.example.com/foo, то он работает, так что конец сервисного компьютера настроен нормально.

Но, если я добавлю тот же URL (wss://myservice.example.com/foo), что иконечная точка в определении API в WSO2 Publisher, затем клиент просто зависает, и я получаю нулевой указатель выше.

Мы все еще находимся на версии 2.1 Менеджера API

1 Ответ

0 голосов
/ 21 июня 2019

Возможная причина:

NullPointerException - это ошибка в wso2 / carbon-apimgt проекте, которая исправляется этим PR

Но я видел в ваших журналах

org.wso2.carbon.websocket.transport.WebsocketConnectionFactory.cacheNewConnection

Этоинтересует публикация API, в то время как конфигурация TokenCacheExpiry включена в проекте.Исправлено с помощью этого PR

Возможное решение:

В вашем случае я нашел блеск пример Можете ли вы попробоватьизменить только настройки вашего порта

...