每个Camel + Jetty路由使用不同的SSL证书

时间:2012-04-13 19:31:07

标签: ssl https apache-camel jetty apache-servicemix

我使用在ServiceMix(Fuse)中运行的Camel Jetty组件公开了一系列Web服务。类似的东西:

<route>
      <from uri="jetty:http://0.0.0.0:25100/service1"/>
      ...
</route>    
<route>
      <from uri="jetty:http://0.0.0.0:25100/service2"/>
      ...
</route>

我希望能够将它们更改为使用https / ssl但我需要能够为每条路由使用不同的密钥/证书。我已经查看了Jetty组件文档,它描述了如何全局配置Jetty组件以使用SSL,但似乎没有办法为不同的路由指定不同的证书?来自Jetty Component Documentation

<bean id="jetty" class="org.apache.camel.component.jetty.JettyHttpComponent">
    <property name="sslSocketConnectorProperties">
        <properties>
            <property name="password"value="..."/>
            <property name="keyPassword"value="..."/>
            <property name="keystore"value="..."/>
            <property name="needClientAuth"value="..."/>
            <property name="truststore"value="..."/>
        </properties>
    </property>
</bean>

每条路线可以使用不同的证书吗?

1 个答案:

答案 0 :(得分:1)

在任何HTTPS服务器上,证书都是只能为整个主机名配置的属性。

HTTPS是HTTP over TLS,即在发送任何HTTP流量之前首先建立SSL / TLS连接(因此在发送任何URL路径之前):

  

充当HTTP客户端的代理也应充当TLS客户端。   它应该在适当的端口上启动与服务器的连接   然后发送TLS ClientHello以开始TLS握手。当。。。的时候   TLS握手已经完成。然后,客户端可以发起第一个   HTTP请求。所有HTTP数据必须作为TLS“应用程序数据”发送。

当它可以根据路径做出决定时,证书已经发送并且SSL / TLS握手已经结束。

允许这种情况的一种方法是使用不同的主机名。

您可以通过在服务器上配置不同的主机名和IP地址来使用密钥库中的其他别名,或使用其他端口来实现此目的。

原则上,您也可以使用服务器名称指示(SNI)在同一IP地址/端口上使用不同的主机名执行此操作;遗憾的是,即使Java 7也不支持它在服务器端(only on the client side)。解决此问题的典型解决方法是使用多个主题备用名称条目对多个主机有效的单个证书。