apache camel netty component
TRANSCRIPT
![Page 1: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/1.jpg)
Apache Camel Nettyコンポーネント@ssogabe
Japan Apache Camel User Group
![Page 2: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/2.jpg)
アジェンダ
Nettyコンポーネントとは
Nettyコンポーネントの基本
テキスト通信
オブジェクト通信
SSL通信
付録
– Nettyのログ出力
– 電文の16進ダンプ
– キー/トラストストアの生成
![Page 3: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/3.jpg)
参考ソース
TCP - バイナリ通信– http://gitbucket.buildria.com/sogabe/netty-tcp-binary
UDP - バイナリ通信– http://gitbucket.buildria.com/sogabe/netty-udp-binary
TCP - テキスト通信– http://gitbucket.buildria.com/sogabe/netty-tcp-text
TCP - オブジェクト通信– http://gitbucket.buildria.com/sogabe/netty-tcp-object
![Page 4: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/4.jpg)
Nettyコンポーネントとは
Nettyを使用したNIOベースのソケット通信を提供
– TCP/UDP、SSL
– 文字列、オブジェクト、バイナリ
コンシューマ/プロデューサを提供
Camel 2.14.xでは、Netty 3.xベースとNetty
4.xベースのコンポーネントを提供
– ここでは、Netty 3.xベースのNettyコンポーネントについて説明
![Page 5: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/5.jpg)
Nettyコンポーネントの基本
![Page 6: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/6.jpg)
URIフォーマット
TCPとUDPをサポート
– netty:tcp://hostname:9999[?options]
– netty:udp://hostname:9999[?options]
TCPとUDPでオプションが異なる
![Page 7: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/7.jpg)
リクエストの種類
one-wayかrequest-responseをサポート
– syncオプションで指定
– ExchangeのBODYがレスポンスになる
Producer Consumer
Producer Consumer
one-way(sync=false)
request-response(sync=true)
![Page 8: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/8.jpg)
フレーム処理、メッセージ変換処理など
– プロトコル、送信形式によって異なる
Nettyコンポーネントの役割
![Page 9: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/9.jpg)
エンコーダ・デコーダの定義
エンコーダ・デコーダに、Handlerを定義し、Nettyコンポーネントの動作を定義
– one-wayの場合は、いずれか1つでもOK
![Page 10: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/10.jpg)
Handler
送信用(エンコーダ)、受信用(デコーダ)および送受信共用の3種類
スレッドセーフでないHandlerも存在するため、使用する場合は工夫が必要
– スレッドセーフなHandlerには、@Sharableが付与
![Page 11: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/11.jpg)
Handlerの種類 (1)
Handlerは、大きく分けて5種類
– フレーム処理
• メッセージの取り出し、メッセージ長の追加
– 変換処理
• Base64、SSL、圧縮、ChannelBuffer⇔文字列/オブジェクトなどの変換を行う
– イベント処理
• 受信したメッセージの処理
• Nettyコンポーネントが実装するため、使用しない
![Page 12: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/12.jpg)
Handlerの種類 (2)
Handlerは、大きく分けて5種類
– アイドル、タイムアウト処理
• アイドル時、タイムアウト時の処理
• Nettyコンポーネントでは使用しない
– その他
• ロギングなど
• Nettyコンポーネントでは使用しない
![Page 13: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/13.jpg)
エンコーダ・デコーダの定義方法
Nettyコンポーネントでは、3種類の定義をサポート
1. encoder/decoder
2. encoders/decoders
3. serverPipelineFactory/clientPipelineFactory
encoders/decodersを推奨
– encoder/decoderは1つしか設定できない
– server/clientPipelineFactoryは、オプションの一部を使えなくなる
![Page 14: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/14.jpg)
Handlerの定義
Spring XMLにHandlerをbeanタグで定義
– ChannelHandlerFactoriesのHandler生成メソッドを使用
• newStringDecoder()/newStringDecoder()
• newObjectDecoder()/newObjectEncoder()
• newDelimiterBasedFrameDecoder()
• newLengthFieldBasedFrameDecoder()
– Handlerがスレッドセーフか考慮する必要なし
![Page 15: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/15.jpg)
Handlerの定義例
<bean id="length-decoder"
class="org.apache.camel.component.netty.ChannelHandlerFactories"
factory-method="newLengthFieldBasedFrameDecoder">
<constructor-arg value="1048576"/>
<constructor-arg value="0"/>
<constructor-arg value="4"/>
<constructor-arg value="0"/>
<constructor-arg value="4"/>
</bean>
<bean id="string-decoder"
class="org.apache.camel.component.netty.ChannelHandlerFactories"
factory-method="newStringDecoder">
<constructor-arg value="UTF-8" />
</bean>
![Page 16: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/16.jpg)
Handlerの独自実装
ラッパーを実装し、スレッドセーフかどうか判断不要とする
public final class MyHandlerFactories {
private MyHandlerFactories() {
}
public static ChannelHandlerFactory newUserInfoEncoder() {
return new ShareableChannelHandlerFactory(new UserInfoEncoder());
}
public static ChannelHandlerFactory newUserInfoEncoder() {
return new ChannelHandlerFactory() {
@Override
public ChannelHandler newChannelHandler() {
return new UserInfoEncoder();
}
};
}
}
スレッドセーフの場合
スレッドセーフでない場合
![Page 17: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/17.jpg)
エンコーダ・デコーダの定義例(1)
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="netty:tcp://localhost:5150?decoders=#length-decoder,#string-decoder&sync=false"/>
<to uri="mock:multiple-codec"/>
</route>
</camelContext>
encoders/decodersにHandlerを定義
– Handlerのidの先頭に”#”をつける
– 複数設定する場合はカンマ区切り
– カンマの前後はスペース不要
![Page 18: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/18.jpg)
エンコーダ・デコーダの定義例(2)
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="netty:tcp://localhost:5150?decoders=#length-decoder,#string-decoder&sync=false"/>
<to uri="mock:multiple-codec"/>
</route>
</camelContext>
encoders/decodersにHandlerを定義
– ネットワークに近いHandlerから順番に定義
![Page 19: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/19.jpg)
フレーム処理
TCPでは、2つのメッセージを送信した場合、OSは2つではなく、1つのバイト列として扱う
受信側では、電文長やデリミタで識別し、2
つのメッセージに分割する必要あり
![Page 20: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/20.jpg)
標準のフレーム処理(Decoder)
3つのHandlerを標準で提供
– FixedLengthFrameDecoder
• 固定の電文長で分割
– DelimiterBasedFrameDecoder
• NULL(0x00)や改行コードなどのデリミタで分割
– LengthFieldBasedFrameDecoder
• メッセージのフィールドから電文長を取得し分割
![Page 21: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/21.jpg)
標準のフレーム処理(Encoder)
1つのHandlerを標準で提供
– LengthFieldPrepender
• 電文長を算出し、メッセージの先頭に付加
• LengthFieldBasedFrameDecoderと組み合わせることが多い
• 先頭以外に電文長を設定する場合は、実装する必要あり
![Page 22: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/22.jpg)
LengthFieldBasedFrameDecoder(1)
フィールドから電文長を取得し分割
– 電文長が、ペイロードのみの場合や、ヘッダも含む場合も対応
– 取得する範囲も設定可
HDR1 電文長 HDR2 Payload
00 C0 00 00 00 04 0A 00 C0 11 FF EF
HDR1 電文長 HDR2 Payload
00 C0 00 00 00 04 0A 00 C0 11 FF EF
HDR1 電文長 HDR2 Payload
00 C0 00 00 00 0C 0A 00 C0 11 FF EF
HDR2 Payload
0A 00 C0 11 FF EF
電文長がペイロードのバイト長で、HDR1~ペイロードフレーム分けする
電文長がメッセージ全体のバイト長で、HDR2~ペイロードをフレーム分けする
![Page 23: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/23.jpg)
LengthFieldBasedFrameDecoder(2)
5つのパラメータを指定No. パラメータ 説明
1 maxFrameLength 最大電文長。8192など十分大きい値。この値を超えると例外が発生
2 lengthFieldOffset 電文長を表すフィールドの開始位置
3 lengthFieldLength 電文長を表すフィールドのバイト長
4 lengthAdjustment メッセージを切り出す際の補正値
5 initialBytesToStrip メッセージを切り出す開始位置
HDR1 電文長 HDR2 Payload
00 C0 00 00 00 04 0A 00 C0 11 FF EF
lengthFieldOffset(=2)
lengthFieldLength(=4)
initialBytesToStrip(=8)
lengthAdjustment(=2)
Payload
C0 11 FF EF
![Page 24: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/24.jpg)
lengthAdjustmentの算出(1)
HDR1 電文長 HDR2 Payload
00 C0 00 00 00 05 0A 00 C0 11 FF EF D3
電文長フィールドの先頭
lengthFieldOffset(=2)
メッセージを切り出す開始位置
initialBytesToStrip(=8)
バイト長=
電文長フィールドの値
5バイト
電文長フィールドのバイト長
lengthFieldLength(=4)
2バイト
2バイト足すとメッセージ長
lengthAdjustment=2
![Page 25: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/25.jpg)
lengthAdjustmentの算出(2)
HDR1 電文長 HDR2 Payload
00 C0 00 00 00 0C 0A 00 C0 11 FF EF
電文長フィールドの先頭
lengthFieldOffset(=2)
メッセージを切り出す開始位置
initialBytesToStrip(=0)
電文長フィールドのバイト長
lengthFieldLength(=4)
12バイト
バイト長=電文長フィールドの値
6バイト削除するとメッセージ長 lengthAdjustment=-6
![Page 26: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/26.jpg)
定義例
<bean id="length-decoder"
class="org.apache.camel.component.netty.ChannelHandlerFactories"
factory-method="newLengthFieldBasedFrameDecoder">
<constructor-arg value=“8192"/>
<constructor-arg value="0"/>
<constructor-arg value="4"/>
<constructor-arg value="0"/>
<constructor-arg value="4"/>
</bean>
<bean id=“delimiter-decoder"
class="org.apache.camel.component.netty.ChannelHandlerFactories"
factory-method="newDelimiterBasedFrameDecoder">
<constructor-arg value=“8192" />
<constructor-arg value=“\\r" />
<constructor-arg value=“\\n" />
</bean>
<bean id=“length-prepend-encoder”
class=“org.jboss.netty.handler.codec.frame.LengthFieldPrepender”>
<constructor-arg value=“4" />
</bean>
![Page 27: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/27.jpg)
変換処理
ユーザ実装コンポーネントで扱いやすいように、ChannelBuffer(バイト列)を、文字列やオブジェクトに変換
– ユーザ実装コンポーネントでは、バイト列を意識しない
SSLや圧縮については標準で提供
オブジェクトへの変換は、独自実装が必要
![Page 28: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/28.jpg)
標準の変換処理(1)
5組のHandlerを提供
– Base64Encoder/Decoder
• Base64でエンコード/デコード
– ZlibEncoder/Decoder
• Deflateアルゴリズムで圧縮/展開
– StringEncoder/Decoder
• 文字列との変換
• デリミタ区切りであれば、「文字列送受信」参照
![Page 29: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/29.jpg)
標準の変換処理(2)
5組のHandlerを提供
– ObjectEncoder
– ObjectDecoder
• オブジェクトのシリアライズ、デシリアライズ
• 「オブジェクト送受信」参照
– SslHandler
• SSL、TLSおよびstartTLSをサポート
• Apache Camelでオプションを提供しているため、直接使うことはない
![Page 30: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/30.jpg)
独自実装の変換処理
ユーザ実装のオブジェクトと、ChannelBuffer(バイト列)を変換するには、OneToOneDecoder/OneToOneEncoderを継承する
![Page 31: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/31.jpg)
ChannelBufferの操作(1)
ChannelBufferのメソッドを使用して、バイト列の取得、設定
ChannelBufferのデフォルトのバイトオーダは、ビッグエンディアン
– 通常、TCP/IPネットワークではネットワークバイトオーダは、ビッグエンディアン
![Page 32: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/32.jpg)
ChannelBufferの操作(2)
ChannelBufferは、読込位置(readerIndex)、書込位置(writerIndex)を管理
– readXXXでバイト列を取得、writeXXXでバイト列を書き込むと、reader/writerIndexが増加
– getXXX/setXXXは、reader/writerIndexは増加しないので注意が必要
– 基本は、readXXX/writeXXXを使用する
0 readerIndex writerIndex
読み書き不可バイト列 読み込み可能バイト列 書き込み可能バイト列
capacity
![Page 33: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/33.jpg)
OneToOneEncoderの実装例public class UserInfoEncoder extends OneToOneEncoder {
@Override
protected Object encode(ChannelHandlerContext ctx, Channel channel, Object msg) throws Exception {
if (!(msg instanceof UserInfo)) {
return msg;
}
UserInfo info = (UserInfo) msg;
// 可変サイズのバッファを用意
ChannelBuffer buffer = ChannelBuffers.dynamicBuffer();
// Nameのバイト長とName本体
byte[] byteName = info.getName().getBytes(StandardCharsets.UTF_8);
buffer.writeInt(byteName.length);
buffer.writeBytes(byteName);
// Age
buffer.writeInt(info.getAge());
return buffer;
}}
![Page 34: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/34.jpg)
OneToOneDecoderの実装例
public class UserInfoDecoder extends OneToOneDecoder {
@Override
protected Object decode(ChannelHandlerContext ctx, Channel channel, Object msg)
throws Exception {
if (!(msg instanceof ChannelBuffer)) {
return msg;
}
ChannelBuffer buffer = (ChannelBuffer) msg;
// Nameのバイト長とName本体
int length = buffer.readInt();
byte[] byteName = new byte[length];
buffer.readBytes(byteName);
String name = new String(byteName, StandardCharsets.UTF_8);
// age
int age = buffer.readInt();
return new UserInfo(name, age);
}
}
![Page 35: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/35.jpg)
ExchangeのHeader
Nettyコンシューマは、電文受信時にいくつかの値をHeaderに設定
– “CamelNettyRemoteAddress”
• 送信元のIPアドレス
– “CamelNettyLocalAddress”
• 受信したIPアドレス
SSLに関する値も設定。詳しくは、NettyConstantsを参照
![Page 36: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/36.jpg)
テキスト通信
![Page 37: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/37.jpg)
テキストの通信
専用オプションが提供されているため、エンコーダ・デコーダの定義は不要
– プロトコルがTCP
– 文字列形式
– デリミタ区切り
• CR or LFもしくはNULL(0x00)
encoders, decodersは定義しないため、LoggingHandlerなどは設定不可
![Page 38: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/38.jpg)
専用オプション
テキスト通信専用のオプションを提供
No. オプション 説明
1 textline テキスト送信の場合true (false)
2 delimiter デリミタ LINE か NULL (LINE)
3 decoderMaxLineLength 最大長 (1024)
4 autoAppenderDelimiter 送信時にデリミタをつけるかどうか
(true)
5 encoding エンコーディング (JVMのデフォルト)
![Page 39: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/39.jpg)
文字列⇔モデルの変換
業務処理
レスポンス生成 (one-wayの場合は不要)
ルートの実装
![Page 40: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/40.jpg)
コンシューマの例
<camelContext xmlns="http://camel.apache.org/schema/spring">
<endpoint id="server"
uri="netty:tcp://0.0.0.0:9999?sync=false&textline=true&delimiter=LINE&
encoding=ISO-8859-1" />
<route id="GasAlert_Receive"><!– 文字列形式のメッセージを受信 -->
<from ref="server" /><!– 文字列をモデルに変換
<bean ref="GasAlertTransformer" method="toModel" />
<transacted ref="PROPAGATION_REQUIRED"/>
<to uri="mybatis:insert?statementType=Insert"/>
</route>
</camelContext>
テキスト形式のメッセージを受信
– one-way, 改行区切り, ISO-8859-1
![Page 41: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/41.jpg)
プロデューサの例
テキスト形式のメッセージを送信
– one-way, 改行区切り, ISO-8859-1
<camelContext xmlns="http://camel.apache.org/schema/spring">
<endpoint id=“sender" uri="netty:tcp://127.0.0.1:9999?sync=false&textline=true&delimiter=LINE
&encoding=ISO-8859-1" />
<route id="GasAlert_Send"><!– モデルを5秒ごとに生成 -->
<from uri=“dataset:gasAlertDataSet?produceDelay=5000" /><!– モデルを文字列に変換
<bean ref="GasAlertTransformer" method="toMessage" />
<to ref=“sender"/>
</route>
</camelContext>
![Page 42: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/42.jpg)
オブジェクト通信
![Page 43: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/43.jpg)
ObjectDecoder/Encoder
Nettyでは、オブジェクト通信を行うObjectDecoder、ObjectEncoderを提供
– オブジェクト⇔ChannelBufferの変換
– フレーム処理は不要
– ObjectInput/OutputStreamと互換性なし
• ObjectDecoderとObjectEncoderはペアで使うこと
![Page 44: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/44.jpg)
コンシューマの例
<camelContext xmlns="http://camel.apache.org/schema/spring">
<endpoint id="server" uri="netty:tcp://0.0.0.0:9999?sync=false&decoders=#object-decoder" />
<route id="GasAlert_Receive"><!– オブジェクトを受信 -->
<from ref="server" /><transacted ref="PROPAGATION_REQUIRED"/>
<to uri="mybatis:insert?statementType=Insert"/>
</route>
</camelContext>
<bean id=“object-decoder”
class="org.apache.camel.component.netty.ChannelHandlerFactories"
factory-method="newObjectDecoder“ />
![Page 45: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/45.jpg)
SSL通信
![Page 46: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/46.jpg)
SSL通信の概要
sslオプションをtrueに設定すると、SslHandlerを自動的に追加する
– encoders/decodersに設定は不要
– needClientAuth=trueでクライアント認証
– キーストア、トラストストアは、sslContextParametersオプションで指定
証明書、キーストア、トラストストアは、JavaSEのkeytoolで生成
– 「付録 キー/トラストストアの生成」参照
![Page 47: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/47.jpg)
コンシューマでのSSLの設定
キーストア、トラストストアを設定
<camelContext xmlns="http://camel.apache.org/schema/spring">
<endpoint id="tcpserverB"
uri="netty:tcp://10.1.1.53:9998?sync=true&decoders=#frameDecoder,#userInfoDecoder&en
coders=#frameEncoder,#userInfoEncoder&ssl=true&sslContextParameters=#serverSslC
ontextParameters" />
(snip)
<camel:sslContextParameters id="serverSslContextParameters">
<camel:keyManagers keyPassword="osseai">
<camel:keyStore type="JKS" resource="server/keystore" password="osseai" />
</camel:keyManagers>
<camel:trustManagers>
<camel:keyStore type="JKS" resource="server/truststore" password="osseai" />
</camel:trustManagers>
</camel:sslContextParameters>
</camelContext>
キーストア
トラストストア
![Page 48: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/48.jpg)
プロデューサでのSSLの設定
トラストストアを設定
– コンシューマで生成した証明書をインポート<camelContext xmlns="http://camel.apache.org/schema/spring">
<endpoint id="tcpclientB" uri="netty:tcp://10.1.1.53:9998?sync=true&
decoders=#frameDecoder,#userInfoDecoder&encoders=#frameEncoder,#userInfoEncoder&am
p;ssl=true&sslContextParameters=#clientSslContextParameters" />
(snip)
<camel:sslContextParameters id=“clientSslContextParameters">
<camel:trustManagers>
<camel:keyStore type="JKS" resource="server/truststore" password="osseai" />
</camel:trustManagers>
</camel:sslContextParameters>
</camelContext>
トラストストア
![Page 49: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/49.jpg)
クライアント認証
Apache Camel 2.11以降
コンシューマ・プロデューサともに、キーストア、トラストストアを設定
コンシューマのオプションにneedClientAuth=trueを設定
![Page 50: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/50.jpg)
付録
![Page 51: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/51.jpg)
Nettyのログを出力
java.util.loggingがデフォルト
– Camelはslf4jを使用
InternalLoggerFactory#setDefaultFactoryを使用してslf4jに変更
– Camelブート時に実施
InternalLoggerFactory.setDefaultFactory(new Slf4JLoggerFactory());
![Page 52: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/52.jpg)
電文の16進ダンプ (1)
LoggingHandler(String name,
InternalLogLevel level, boolean hexDump)
• name: ログのカテゴリ
• level: DEBUG, INFO, WARN, ERRORのいずれか
• hexDump: trueの場合16進ダンプ出力
[read #1 - NettyClientTCPWorker] DefaultClientPipelineFactory DEBUG [id: 0x54027747, /127.0.0.1:37490 => /127.0.0.1:9998] RECEIVED: BigEndianHeapChannelBuffer(ridx=0, widx=35, cap=35)
+-------------------------------------------------+| 0 1 2 3 4 5 6 7 8 9 a b c d e f |
+--------+-------------------------------------------------+----------------+|00000000| 00 00 00 1f 00 00 00 00 00 00 03 e7 00 00 00 0f |................||00000010| e3 83 ac e3 82 b9 e3 83 9d e3 83 b3 e3 82 b9 00 |................||00000020| 00 00 63 |..c |+--------+-------------------------------------------------+----------------+
![Page 53: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/53.jpg)
電文の16進ダンプ (2)
<camelContext xmlns="http://camel.apache.org/schema/spring">
<endpoint id="server" uri="netty:tcp://0.0.0.0:9999?sync=false&decoders=#logging-handler,#object-decoder" />
<route id="GasAlert_Receive">
<from ref="server" /><transacted ref="PROPAGATION_REQUIRED"/>
<to uri="mybatis:insert?statementType=Insert"/>
</route>
</camelContext>
(snip)
<bean id="logging-handler”
class="org.jboss.netty.handler.logging.LoggingHandler">
<constructor-arg value="com.buildria.camel.socket" />
<constructor-arg value="DEBUG" />
<constructor-arg value="true" />
</bean>
![Page 54: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/54.jpg)
キー/トラストストアの生成
keytoolを使って、JKSキーストア・トラストストアを生成
– JKSキーストア
• (公開/非公開鍵を持つ) keyEntry
– JKSトラストストア
• (公開鍵のみ) trustedCertEntry
自己署名付き証明書を使用• 証明書署名要求(CSR)を生成して、CAに署名してもらってもOK
![Page 55: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/55.jpg)
キーストアと自己署名付き証明書の生成
キーストアと自己署名付き証明を生成
– アルゴリズム RSA、有効期間 1440日
– ファイル名 keystore$ keytool -genkeypair -alias osseai -keyalg RSA -validity 1440 -keystore keystoreキーストアのパスワードを入力してください:新規パスワードを再入力してください:姓名を入力してください。[Unknown]: COM TARO組織単位名を入力してください。[Unknown]: Core Technology組織名を入力してください。[Unknown]: NTT COMWARE都市名または地域名を入力してください。[Unknown]: Chiba都道府県名を入力してください。[Unknown]: Chibaこの単位に該当する2文字の国コードを入力してください。[Unknown]: JP
CN=COM TARO, OU=Core Technology, O=NTT COMWARE, L=Chiba, ST=Chiba, C=JPでよろしいですか。[いいえ]: はい
<osseai>の鍵パスワードを入力してください(キーストアのパスワードと同じ場合はRETURNを押してください):
![Page 56: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/56.jpg)
キーストアの確認$ keytool -list -v -keystore keystoreキーストアのパスワードを入力してください:
キーストアのタイプ: JKSキーストア・プロバイダ: SUN
キーストアには1エントリが含まれます
別名: osseai作成日: 2014/10/29エントリ・タイプ: PrivateKeyEntry証明書チェーンの長さ: 1証明書[1]:所有者: CN=COM TARO, OU=Core Technology, O=NTT COMWARE, L=Chiba, ST=Chiba, C=JP発行者: CN=COM TARO, OU=Core Technology, O=NTT COMWARE, L=Chiba, ST=Chiba, C=JPシリアル番号: 6728b314有効期間の開始日: Wed Oct 29 11:28:53 JST 2014終了日: Mon Oct 08 11:28:53 JST 2018証明書のフィンガプリント:
MD5: CD:E7:C1:61:D3:A7:07:FE:E4:DE:F0:91:24:D4:A8:38SHA1: 63:F2:FA:31:9A:4C:A3:A5:36:58:72:25:9F:EC:C5:63:5C:E0:7B:B0SHA256: 11:58:8C:BC:B1:1E:25:25:3E:35:53:49:A7:F3:68:67:18:9E:51:52:89:2D:73:62:F7:28:E3:37:98:E4:AF:D2署名アルゴリズム名: SHA256withRSAバージョン: 3
拡張:
#1: ObjectId: 2.5.29.14 Criticality=falseSubjectKeyIdentifier [KeyIdentifier [0000: FC 2D 94 81 30 0B 60 B5 C9 BC D5 8F FA AB E6 CA .-..0.`.........0010: 51 A6 E6 F5 Q...]]
![Page 57: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/57.jpg)
自己署名付き証明書のエクスポート
キーストアから自己署名付き証明書をエクスポート
$ keytool -export -alias osseai -keystore keystore -rfc -file osseai.cerキーストアのパスワードを入力してください:証明書がファイル<osseai.cer>に保存されました
$ cat osseai.cer-----BEGIN CERTIFICATE-----
MIIDhzCCAm+gAwIBAgIEZyizFDANBgkqhkiG9w0BAQsFADB0MQswCQYDVQQGEwJKUDEOMAwGA1UECBMFQ2hpYmExDjAMBgNVBAcTBUNoaWJhMRQwEgYDVQQKEwtOVFQgQ09NV0FSRTEYMBYGA1UECxMPQ29yZSBUZWNobm9sb2d5MRUwEwYDVQQDEwxTZWlqaSBTb2dhYmUwHhcNMTQxMDI5MDIyODUzWhcNMTgxMDA4MDIyODUzWjB0MQswCQYDVQQGEwJKUDEOMAwGA1UECBMFQ2hpYmExDjAMBgNVBAcTBUNoaWJhMRQwEgYDVQQKEwtOVFQgQ09NV0FSRTEYMBYGA1UECxMPQ29yZSBUZWNobm9sb2d5MRUwEwYDVQQDEwxTZWlqaSBTb2dhYmUwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCO25xWQig9/zjmVTNmL08StTJyMAWy9FL8IdX2QQi45pVmzLh+UGdVagOzglXKpIX5xlkeW6RD+KmnBKHN8Qj0lK7FNgWIoRUcSPM33tWowq8gnGZcsDH33g4NcdSgxJQe3nf/oJrTgGHFyo3mbKJjLcb6zsJWmgFhJSor//ao1Bdic7KjSovlipmjHvfeJ1Pqpc+u2cq4QRTpjGs/tSyRRchBtlVsMW+T6DTHdbbcrBdcptEEuQhGrYpO0RtVMstKXlWQIUUi/Ut8wm5dKOL/jYeHj82np0QiI2weLkzfmfpa6IEU1ek7EEb89CXkgO3NL4keeGbS0ue7bna0WRDZAgMBAAGjITAfMB0GA1UdDgQWBBT8LZSBMAtgtcm81Y/6q+bKUabm9TANBgkqhkiG9w0BAQsFAAOCAQEADkPgAv36gcioc/j72x9W4kCt2dvhSoTjKm3+lm8vFC5mweAJ2CasiZ1hzsDdWTCeaTXzbiom/rZrEpakZsffoyLaUtgdy2XjTb3sfeqXCTSzEJDF7UjNVHuwKwRT9IgBd9fG4x9AO9dcqiKWqLN09PLdyNPPTYViBhf+8w3PD/TI4oR2Ibl7A47l+5WfA9OAI+hfZKnSroXwzimh/j1kU5JLhFGcngro7klTs6o2pDcEzDhwT0DVTPRAstUek2RVRoG86UDa2RsKl68FfFb7jjFbOdZdEssFBL7lLXRZ7lID5oNqAExs2TT6bahjTluwORy8eemZnoeXZfnimGISEQ==-----END CERTIFICATE-----
![Page 58: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/58.jpg)
トラストストアの生成
自己署名付き証明書をトラストストアにインポート
$ keytool -import -alias osseaicert -file osseai.cer -keystore truststoreキーストアのパスワードを入力してください:新規パスワードを再入力してください:所有者: CN=COM TARO, OU=Core Technology, O=NTT COMWARE, L=Chiba, ST=Chiba, C=JP発行者: CN=COM TARO, OU=Core Technology, O=NTT COMWARE, L=Chiba, ST=Chiba, C=JPシリアル番号: 6728b314有効期間の開始日: Wed Oct 29 11:28:53 JST 2014終了日: Mon Oct 08 11:28:53 JST 2018証明書のフィンガプリント:
MD5: CD:E7:C1:61:D3:A7:07:FE:E4:DE:F0:91:24:D4:A8:38SHA1: 63:F2:FA:31:9A:4C:A3:A5:36:58:72:25:9F:EC:C5:63:5C:E0:7B:B0SHA256: 11:58:8C:BC:B1:1E:25:25:3E:35:53:49:A7:F3:68:67:18:9E:51:52:89:2D:73:62:F7:28:E3:37:98:E4:AF:D2署名アルゴリズム名: SHA256withRSAバージョン: 3
拡張:
#1: ObjectId: 2.5.29.14 Criticality=falseSubjectKeyIdentifier [KeyIdentifier [0000: FC 2D 94 81 30 0B 60 B5 C9 BC D5 8F FA AB E6 CA .-..0.`.........0010: 51 A6 E6 F5 Q...]]
この証明書を信頼しますか。 [いいえ]: はい証明書がキーストアに追加されました
![Page 59: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/59.jpg)
トラストストアの確認$ keytool -list -v -keystore truststoreキーストアのパスワードを入力してください:
キーストアのタイプ: JKSキーストア・プロバイダ: SUN
キーストアには1エントリが含まれます
別名: osseaicert作成日: 2014/10/29エントリ・タイプ: trustedCertEntry
所有者: CN=COM TARO, OU=Core Technology, O=NTT COMWARE, L=Chiba, ST=Chiba, C=JP発行者: CN=COM TARO, OU=Core Technology, O=NTT COMWARE, L=Chiba, ST=Chiba, C=JPシリアル番号: 6728b314有効期間の開始日: Wed Oct 29 11:28:53 JST 2014終了日: Mon Oct 08 11:28:53 JST 2018証明書のフィンガプリント:
MD5: CD:E7:C1:61:D3:A7:07:FE:E4:DE:F0:91:24:D4:A8:38SHA1: 63:F2:FA:31:9A:4C:A3:A5:36:58:72:25:9F:EC:C5:63:5C:E0:7B:B0SHA256: 11:58:8C:BC:B1:1E:25:25:3E:35:53:49:A7:F3:68:67:18:9E:51:52:89:2D:73:62:F7:28:E3:37:98:E4:AF:D2署名アルゴリズム名: SHA256withRSAバージョン: 3
拡張:
#1: ObjectId: 2.5.29.14 Criticality=falseSubjectKeyIdentifier [KeyIdentifier [0000: FC 2D 94 81 30 0B 60 B5 C9 BC D5 8F FA AB E6 CA .-..0.`.........0010: 51 A6 E6 F5 Q...]]
![Page 60: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/60.jpg)
プロデューサのトラストストア
コンシューマで生成した自己署名付き証明書をインポートして、トラストストアを生成
– 「トラストストアの生成」参照
![Page 61: Apache Camel Netty component](https://reader033.vdocuments.us/reader033/viewer/2022042506/5598ea8d1a28aba9448b47fd/html5/thumbnails/61.jpg)
クライアント認証
プロデューサでも、コンシューマと同様に、キーストア、トラストストア、自己署名付き証明書を生成
コンシューマとプロデューサのトラストストアに、2つの自己署名付き証明書をインポート
keytoolについては、以下を参照
http://docs.oracle.com/javase/jp/7/technotes/guides/security/jsse/JSSERefGuide.html#Cre
ateKeystore