第5章 Camel CXF コンポーネントのセキュリティー保護

概要

この章では、Camel CXF プロキシーのデモンストレーションを開始点として使用して、Camel CXF エンドポイントで SSL/TLS セキュリティーを有効にする方法について説明します。Camel CXF コンポーネントを使用すると、Apache CXF エンドポイントを Apache Camel ルートに追加できます。これにより、Apache Camel で Web サービスをシミュレートしたり、WS クライアントと Web サービスの間にルートを挿入して追加の処理を実行したり (ここで検討するケース) できます。

5.1. Camel CFX プロキシーのデモンストレーション

概要

このチュートリアルでは、OSGi で Camel CXF エンドポイントをセキュリティー保護する方法を説明するために、Apache Camel のスタンドアロンディストリビューションから使用できる例を示しています。それが Camel CXF プロキシー デモ です。図5.1「Camel CFX プロキシーの概要」 は、このデモンストレーションがどのように機能するかの概要を示しています。

図5.1 Camel CFX プロキシーの概要

camel cxf 01

RealWebServiceBean によって実装されたレポートインシデント Web サービスは、インシデント (例: 交通事故) の詳細を受信し、クライアントに追跡コードを返します。ただし、WS クライアントは、要求を実際の Web サービスに直接送信する代わりに、WS クライアントと実際の Web サービスの間に置かれたエンドポイントに接続します。Apache Camel ルートは (enrichBean を使用して) WSDL メッセージに何らかの処理を実行した後に実際の Web サービスに転送します。

警告

SSL/TLS セキュリティーを有効にする場合は、Poodle 脆弱性 (CVE-2014-3566) に対して保護するために、SSLv3 プロトコルを明示的に無効にする必要があります。詳細は、Disabling SSLv3 in JBoss Fuse 6.x and JBoss A-MQ 6.x を参照してください。

変更

OSGi のコンテキストで Camel CXF エンドポイントの SSL/TLS を有効にする方法を示すために、この章では基本的なデモンストレーションを次のように変更する方法を説明しています。

  1. SSL/TLS セキュリティーは、WS クライアントと Camel CXF エンドポイント間の接続で有効化されている。
  2. Apache Camel ルートと RealWebServiceBean Bean の両方が OSGi コンテナーにデプロイされている。

デモンストレーションコードの取得

Camel CXF プロキシーのデモンストレーションは、InstallDir/extras ディレクトリーに含まれる Apache Camel のスタンドアロンディストリビューションでのみ利用可能です。標準のアーカイブユーティリティーを使用して、Camel アーカイブファイルを展開し、ファイルシステム上の便利な場所にコンテンツを抽出します。

Apache Camel を CamelInstallDir にインストールした場合、Camel CFX プロキシーのデモは次のディレクトリーにあります。

CamelInstallDir/examples/camel-example-cxf-proxy

サンプル証明書の取得

このデモには X.509 証明書が必要です。実際のデプロイメントでは、プライベート認証局を使用してこれらの証明書を自分で生成する必要があります。ただし、このデモでは、Apache CXF の wsdl_first_http の例からいくつかのサンプル証明書を使用します。このデモは、InstallDir/extras ディレクトリーに含まれる Apache CXF のスタンドアロンディストリビューションから入手できます。標準のアーカイブユーティリティーを使用して、CFX アーカイブファイルを展開し、ファイルシステム上の便利な場所にコンテンツを抽出します。

Apache CXF を CXFInstallDir にインストールしている場合、以下のディレクトリーに wsdl_first_http デモンストレーションがあります。

CXFInstallDir/samples/wsdl_first_http

WSDL コントラクトの物理部分

WSDL コントラクトの物理部分は、wsdl:service および wsdl:port 要素を参照します。これらの要素は、特定の Web サービスエンドポイントに接続するために必要なトランスポートの詳細を指定します。このデモンストレーションの目的において、これは契約の中でも最も興味深い部分です。詳細については 例5.1「ReportIncidentEndpointService WSDL サービス」 を参照してください。

例5.1 ReportIncidentEndpointService WSDL サービス

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
    ...
	xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
	targetNamespace="http://reportincident.example.camel.apache.org">
    ...
    <!-- Service definition -->
    <wsdl:service name="ReportIncidentEndpointService">
        <wsdl:port name="ReportIncidentEndpoint" binding="tns:ReportIncidentBinding">
            <soap:address location="http://localhost:9080/camel-example-cxf-proxy/webservices/incident"/>
        </wsdl:port>
    </wsdl:service>

</wsdl:definitions>
注記

WSDL コントラクトに表示されるアドレス URL (soap:address 要素の location 属性の値) は、アプリケーションコードがアドレス URL のデフォルト値を上書きするため、ここでは重要ではありません。

WSDL アドレス指定の詳細

WS クライアントが WSDL サービスに接続するには、WSDL サービス名WSDL ポート名、および Web サービスの アドレス URL の 3 つの情報が必要です。この例では、プロキシー Web サービスや実際の Web サービスとの接続に、次のアドレス指定の詳細が使用されます。

WSDL サービス名

WSDL サービスの完全な QName は次のとおりです。

{http://reportincident.example.camel.apache.org}ReportIncidentEndpointService
WSDL ポート名

WSDL ポートの完全な QName は次のとおりです。

{http://reportincident.example.camel.apache.org}ReportIncidentEndpoint
アドレス URL

プロキシー Web サービス エンドポイント (HTTPS プロトコルを使用) のアドレス URL は次のとおりです。

https://localhost:9080/camel-example-cxf-proxy/webservices/incident
注記

上記のアドレスは、バンドルの Spring 設定ファイル src/main/resources/META-INF/spring/camel-config.xmlcxf:cxfEndpoint 要素を使用して reportIncident Bean が作成されると指定されます。

実際の Web サービス エンドポイント (HTTP プロトコルを使用する) のアドレス URL は次のとおりです。

http://localhost:9081/real-webservice
注記

上記のアドレスは、realWebService Bean がバンドルの Spring 設定ファイル (src/main/resources/META-INF/spring/camel-config.xml) で作成される際に指定されます。