0

ServiceMix(Fuse)で実行されているCamelJettyコンポーネントを使用して公開された一連の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コンポーネントのドキュメントを見ましたが、SSLを使用するようにJettyコンポーネントをグローバルに構成する方法を説明していますが、ルートごとに異なる証明書を指定する方法はないようです。Jettyコンポーネントのドキュメントから:

<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>

ルートごとに異なる証明書を使用することは可能ですか?

4

1 に答える 1

1

どの HTTPS サーバーでも、証明書はホスト名全体に対してのみ構成できるプロパティです。

HTTPS はHTTP over TLSです。つまり、HTTP トラフィックが送信される前に (したがって、URL パスが送信される前に) SSL/TLS 接続が最初に確立されます。

HTTP クライアントとして機能するエージェントは、TLS クライアントとしても機能する必要があります。適切なポートでサーバーへの接続を開始し、TLS ClientHello を送信して TLS ハンドシェイクを開始する必要があります。TLS ハンドシェイクが終了したとき。その後、クライアントは最初の HTTP 要求を開始できます。すべての HTTP データは、TLS の「アプリケーション データ」として送信する必要があります。

パスに応じて決定できるようになるまでに、証明書は既に送信されており、SSL/TLS ハンドシェイクは終了しています。

これを可能にする 1 つの方法は、個別のホスト名を使用することです。

これを行うには、サーバー上で異なるホスト名と IP アドレスを構成して、キーストアから別のエイリアスを使用するか、別のポートを使用します。

原則として、Server Name Indication (SNI) を使用して、同じ IP アドレス/ポート上の個別のホスト名でこれを行うこともできます。残念ながら、Java 7 でさえサーバー側ではサポートしていません (クライアント側のみ)。これに対する一般的な回避策は、複数の Subject Alternative Name エントリを使用して、複数のホストに対して有効な単一の証明書を使用することです。

于 2012-04-13T21:04:11.307 に答える