229.5.3. リクエスト応答通信を使用した SSL/TCP ベースの Netty コンシューマーエンドポイント
JSSE 設定ユーティリティーの使用
Camel 2.9 の時点で、Netty コンポーネントは Camel JSSE 設定ユーティリティーを介して SSL/TLS 設定をサポートします。 このユーティリティーは、エンドポイントおよびコンポーネントレベルで記述し、設定する必要のあるコンポーネント固有のコードの量を大幅に削減します。 以下の例は、Netty コンポーネントでユーティリティーを使用する方法を示しています。
コンポーネントのプログラムによる設定
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); NettyComponent nettyComponent = getContext().getComponent("netty4", NettyComponent.class); nettyComponent.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="netty4:tcp://localhost:5150?sync=true&ssl=true&sslContextParameters=#sslContextParameters"/> ...
[[Netty4-UsingBasicSSL/TLSconfigurationontheJettyComponent]] Jetty コンポーネントの基本的な SSL/TLS 設定の使用
JndiRegistry registry = new JndiRegistry(createJndiContext()); registry.bind("password", "changeit"); registry.bind("ksf", new File("src/test/resources/keystore.jks")); registry.bind("tsf", new File("src/test/resources/keystore.jks")); context.createRegistry(registry); context.addRoutes(new RouteBuilder() { public void configure() { String netty_ssl_endpoint = "netty4:tcp://localhost:5150?sync=true&ssl=true&passphrase=#password" + "&keyStoreFile=#ksf&trustStoreFile=#tsf"; String return_string = "When You Go Home, Tell Them Of Us And Say," + "For Your Tomorrow, We Gave Our Today."; from(netty_ssl_endpoint) .process(new Processor() { public void process(Exchange exchange) throws Exception { exchange.getOut().setBody(return_string); } } } });
SSLSession およびクライアント証明書へのアクセス
クライアント証明書に関する詳細を取得する必要がある場合は、javax.net.ssl.SSLSession
にアクセスできます。ssl=true
の場合、Netty4 コンポーネントは以下のように SSLSession
を Camel メッセージにヘッダーとして保存します。
SSLSession session = exchange.getIn().getHeader(NettyConstants.NETTY_SSL_SESSION, SSLSession.class); // get the first certificate which is client certificate javax.security.cert.X509Certificate cert = session.getPeerCertificateChain()[0]; Principal principal = cert.getSubjectDN();
クライアントを認証するために needClientAuth=true
を設定するのを忘れないようにしてください。それ以外の場合、SSLSession
はクライアント証明書に関する情報にアクセスできないため、例外 javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
が発生することがあります。また、クライアント証明書の有効期限が切れるか、有効でない場合はこの例外を取得することもできます。
sslClientCertHeaders
オプションを true
に設定し、クライアント証明書に関する詳細が含まれるヘッダーを使用して Camel メッセージを強化できます。たとえば、サブジェクト名は CamelNettySSLClientCertSubjectName
ヘッダーで読み取り可能です。