22.20. 高度な使用方法
HTTP プロデューサーをさらに制御する必要がある場合は、さまざまなクラスを設定してカスタム動作を提供できる HttpComponent
を使用する必要があります。
22.20.1. HTTP クライアントの SSL の設定
JSSE 設定ユーティリティーの使用
HTTP コンポーネントは、Camel JSSE Configuration Utility を介して SSL/TLS 設定をサポートします。このユーティリティーは、記述する必要があるコンポーネント固有のコードの量を大幅に削減し、エンドポイントおよびコンポーネントレベルで設定できます。次の例は、HTTP コンポーネントでユーティリティーを使用する方法を示しています。
コンポーネントのプログラムによる設定
KeyStoreParameters ksp = new KeyStoreParameters(); ksp.setResource("/users/home/server/keystore.jks"); ksp.setPassword("keystorePassword"); KeyManagersParameters kmp = new KeyManagersParameters(); kmp.setKeyStore(ksp); kmp.setKeyPassword("keyPassword"); SSLContextParameters scp = new SSLContextParameters(); scp.setKeyManagers(kmp); HttpComponent httpComponent = getContext().getComponent("https", HttpComponent.class); httpComponent.setSslContextParameters(scp);
エンドポイントの Spring DSL ベースの設定
<camel:sslContextParameters id="sslContextParameters"> <camel:keyManagers keyPassword="keyPassword"> <camel:keyStore resource="/users/home/server/keystore.jks" password="keystorePassword"/> </camel:keyManagers> </camel:sslContextParameters> <to uri="https://127.0.0.1/mail/?sslContextParameters=#sslContextParameters"/>
Apache HTTP クライアントを直接設定する
基本的に camel-http コンポーネントは Apache HttpClient の上に構築されます。詳細については、SSL/TLS のカスタマイズ を参照するか、org.apache.camel.component.http.HttpsServerTestSupport
単体テスト基本クラスを調べてください。
カスタム org.apache.camel.component.http.HttpClientConfigurer
を実装して、http クライアントを完全に制御する必要がある場合は、その設定を行うこともできます。
ただし、キーストアとトラストストアを指定する だけ の場合は、Apache HTTP HttpClientConfigurer
を使用してこれを行うことができます。次に例を示します。
KeyStore keystore = ...; KeyStore truststore = ...; SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("https", 443, new SSLSocketFactory(keystore, "mypassword", truststore)));
次に、HttpClientConfigurer
を実装するクラスを作成し、上記の例に従ってキーストアまたはトラストストアを提供する https プロトコルを登録する必要があります。次に、キャメルルートビルダークラスから次のように接続できます。
HttpComponent httpComponent = getContext().getComponent("http", HttpComponent.class); httpComponent.setHttpClientConfigurer(new MyHttpClientConfigurer());
Spring DSL を使用してこれを行う場合、URI を使用して HttpClientConfigurer
を指定できます。以下に例を示します。
<bean id="myHttpClientConfigurer" class="my.https.HttpClientConfigurer"> </bean> <to uri="https://myhostname.com:443/myURL?httpClientConfigurer=myHttpClientConfigurer"/>
上記のように HttpClientConfigurer を実装し、キーストアとトラストストアを設定する限り、問題なく動作します。
HTTPS を使用して落とし穴を認証する
あるエンドユーザーが、HTTPS での認証に問題があると報告しました。この問題は、カスタム設定の org.apache.http.protocol.HttpContext
を提供することで最終的に解決されました。
- 1.HttpContexts の (Spring) ファクトリーを作成します。
public class HttpContextFactory { private String httpHost = "localhost"; private String httpPort = 9001; private BasicHttpContext httpContext = new BasicHttpContext(); private BasicAuthCache authCache = new BasicAuthCache(); private BasicScheme basicAuth = new BasicScheme(); public HttpContext getObject() { authCache.put(new HttpHost(httpHost, httpPort), basicAuth); httpContext.setAttribute(ClientContext.AUTH_CACHE, authCache); return httpContext; } // getter and setter }
- 2.Spring アプリケーションコンテキストファイルで HttpContext を宣言します。
<bean id="myHttpContext" factory-bean="httpContextFactory" factory-method="getObject"/>
- 3.http URL でコンテキストを参照します。
<to uri="https://myhostname.com:443/myURL?httpContext=myHttpContext"/>
異なる SSLContextParameters の使用
HTTP コンポーネントは、コンポーネントごとに org.apache.camel.support.jsse.SSLContextParameters
の 1 つのインスタンスのみをサポートします。2 つ以上の異なるインスタンスを使用する必要がある場合は、以下に示すように複数の HTTP コンポーネントを設定する必要があります。2 つのコンポーネントがあり、それぞれが sslContextParameters
プロパティーの独自のインスタンスを使用しています。
<bean id="http-foo" class="org.apache.camel.component.http.HttpComponent"> <property name="sslContextParameters" ref="sslContextParams1"/> <property name="x509HostnameVerifier" ref="hostnameVerifier"/> </bean> <bean id="http-bar" class="org.apache.camel.component.http.HttpComponent"> <property name="sslContextParameters" ref="sslContextParams2"/> <property name="x509HostnameVerifier" ref="hostnameVerifier"/> </bean>