149.17. 高度な使用方法
HTTP プロデューサーをさらに制御する必要がある場合は、さまざまなクラスを設定してカスタム動作を提供できる HttpComponent
を使用する必要があります。
149.17.1. HTTP クライアントの SSL の設定
JSSE 設定ユーティリティーの使用
Camel 2.8 の時点で、HTTP4 コンポーネントは Camel JSSE Configuration Utility を介した SSL/TLS 設定をサポートしています。 このユーティリティーは、記述する必要があるコンポーネント固有のコードの量を大幅に削減し、エンドポイントおよびコンポーネントレベルで設定できます。 次の例は、HTTP4 コンポーネントでユーティリティーを使用する方法を示しています。
コンポーネントのプログラムによる設定
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("https4", HttpComponent.class);
httpComponent.setSslContextParameters(scp);
Copy to clipboardCopiedエンドポイントの 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="https4://127.0.0.1/mail/?sslContextParameters=#sslContextParameters"/>...
Copy to clipboardCopiedApache HTTP クライアントを直接設定する
基本的に camel-http4 コンポーネントは Apache HttpClient の上に構築されます。詳細については、SSL/TLS customization を参照するか、org.apache.camel.component.http4.HttpsServerTestSupport
単体テスト基本クラスを調べてください。
カスタム org.apache.camel.component.http4.HttpClientConfigurer
を実装して、http クライアントを完全に制御する必要がある場合は、その設定を行うこともできます。
ただし、キーストアとトラストストアを指定する だけ の場合は、Apache HTTP HttpClientConfigurer
を使用してこれを行うことができます。次に例を示します。
KeyStore keystore = ...;
KeyStore truststore = ...;
SchemeRegistry registry = new SchemeRegistry();
registry.register(new Scheme("https", 443, new SSLSocketFactory(keystore, "mypassword", truststore)));
Copy to clipboardCopied
次に、HttpClientConfigurer
を実装するクラスを作成し、上記の例に従ってキーストアまたはトラストストアを提供する https プロトコルを登録する必要があります。次に、キャメルルートビルダークラスから次のように接続できます。
HttpComponent httpComponent = getContext().getComponent("http4", HttpComponent.class);
httpComponent.setHttpClientConfigurer(new MyHttpClientConfigurer());
Copy to clipboardCopied
Spring DSL を使用してこれを行う場合、URI を使用して HttpClientConfigurer
を指定できます。以下に例を示します。
<bean id="myHttpClientConfigurer"
class="my.https.HttpClientConfigurer">
</bean>
<to uri="https4://myhostname.com:443/myURL?httpClientConfigurer=myHttpClientConfigurer"/>
Copy to clipboardCopied上記のように 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
}
Copy to clipboardCopied- 2.Spring アプリケーションコンテキストファイルで HttpContext を宣言します。
<bean id="myHttpContext" factory-bean="httpContextFactory" factory-method="getObject"/>
Copy to clipboardCopied- 3.http4 URL でコンテキストを参照します。
<to uri="https4://myhostname.com:443/myURL?httpContext=myHttpContext"/>
Copy to clipboardCopied異なる SSLContextParameters の使用
HTTP4 コンポーネントは、コンポーネントごとに org.apache.camel.util.jsse.SSLContextParameters
の 1 つのインスタンスのみをサポートします。2 つ以上の異なるインスタンスを使用する必要がある場合は、以下に示すように複数の HTTP4 コンポーネントを設定する必要があります。2 つのコンポーネントがあり、それぞれが sslContextParameters
プロパティーの独自のインスタンスを使用しています。
<bean id="http4-foo" class="org.apache.camel.component.http4.HttpComponent">
<property name="sslContextParameters" ref="sslContextParams1"/>
<property name="x509HostnameVerifier" ref="hostnameVerifier"/>
</bean>
<bean id="http4-bar" class="org.apache.camel.component.http4.HttpComponent">
<property name="sslContextParameters" ref="sslContextParams2"/>
<property name="x509HostnameVerifier" ref="hostnameVerifier"/>
</bean>
Copy to clipboardCopied