第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 プロキシーの概要
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 を有効にする方法を示すために、この章では基本的なデモンストレーションを次のように変更する方法を説明しています。
- SSL/TLS セキュリティーは、WS クライアントと Camel CXF エンドポイント間の接続で有効化されている。
-
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.xml
でcxf:cxfEndpoint
要素を使用してreportIncident
Bean が作成されると指定されます。実際の Web サービス エンドポイント (HTTP プロトコルを使用する) のアドレス URL は次のとおりです。
http://localhost:9081/real-webservice
注記上記のアドレスは、
realWebService
Bean がバンドルの Spring 設定ファイル (src/main/resources/META-INF/spring/camel-config.xml
) で作成される際に指定されます。