61
Apache Camel Nettyコンポーネント @ssogabe Japan Apache Camel User Group

Apache Camel Netty component

  • Upload
    ssogabe

  • View
    520

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Apache Camel Netty component

Apache Camel Nettyコンポーネント@ssogabe

Japan Apache Camel User Group

Page 2: Apache Camel Netty component

アジェンダ

Nettyコンポーネントとは

Nettyコンポーネントの基本

テキスト通信

オブジェクト通信

SSL通信

付録

– Nettyのログ出力

– 電文の16進ダンプ

– キー/トラストストアの生成

Page 3: Apache Camel Netty component

参考ソース

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

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

Nettyコンポーネントの基本

Page 6: Apache Camel Netty component

URIフォーマット

TCPとUDPをサポート

– netty:tcp://hostname:9999[?options]

– netty:udp://hostname:9999[?options]

TCPとUDPでオプションが異なる

Page 7: Apache Camel Netty component

リクエストの種類

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

フレーム処理、メッセージ変換処理など

– プロトコル、送信形式によって異なる

Nettyコンポーネントの役割

Page 9: Apache Camel Netty component

エンコーダ・デコーダの定義

エンコーダ・デコーダに、Handlerを定義し、Nettyコンポーネントの動作を定義

– one-wayの場合は、いずれか1つでもOK

Page 10: Apache Camel Netty component

Handler

送信用(エンコーダ)、受信用(デコーダ)および送受信共用の3種類

スレッドセーフでないHandlerも存在するため、使用する場合は工夫が必要

– スレッドセーフなHandlerには、@Sharableが付与

Page 11: Apache Camel Netty component

Handlerの種類 (1)

Handlerは、大きく分けて5種類

– フレーム処理

• メッセージの取り出し、メッセージ長の追加

– 変換処理

• Base64、SSL、圧縮、ChannelBuffer⇔文字列/オブジェクトなどの変換を行う

– イベント処理

• 受信したメッセージの処理

• Nettyコンポーネントが実装するため、使用しない

Page 12: Apache Camel Netty component

Handlerの種類 (2)

Handlerは、大きく分けて5種類

– アイドル、タイムアウト処理

• アイドル時、タイムアウト時の処理

• Nettyコンポーネントでは使用しない

– その他

• ロギングなど

• Nettyコンポーネントでは使用しない

Page 13: Apache Camel Netty component

エンコーダ・デコーダの定義方法

Nettyコンポーネントでは、3種類の定義をサポート

1. encoder/decoder

2. encoders/decoders

3. serverPipelineFactory/clientPipelineFactory

encoders/decodersを推奨

– encoder/decoderは1つしか設定できない

– server/clientPipelineFactoryは、オプションの一部を使えなくなる

Page 14: Apache Camel Netty component

Handlerの定義

Spring XMLにHandlerをbeanタグで定義

– ChannelHandlerFactoriesのHandler生成メソッドを使用

• newStringDecoder()/newStringDecoder()

• newObjectDecoder()/newObjectEncoder()

• newDelimiterBasedFrameDecoder()

• newLengthFieldBasedFrameDecoder()

– Handlerがスレッドセーフか考慮する必要なし

Page 15: Apache Camel Netty component

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

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

エンコーダ・デコーダの定義例(1)

<camelContext xmlns="http://camel.apache.org/schema/spring">

<route>

<from uri="netty:tcp://localhost:5150?decoders=#length-decoder,#string-decoder&amp;sync=false"/>

<to uri="mock:multiple-codec"/>

</route>

</camelContext>

encoders/decodersにHandlerを定義

– Handlerのidの先頭に”#”をつける

– 複数設定する場合はカンマ区切り

– カンマの前後はスペース不要

Page 18: Apache Camel Netty component

エンコーダ・デコーダの定義例(2)

<camelContext xmlns="http://camel.apache.org/schema/spring">

<route>

<from uri="netty:tcp://localhost:5150?decoders=#length-decoder,#string-decoder&amp;sync=false"/>

<to uri="mock:multiple-codec"/>

</route>

</camelContext>

encoders/decodersにHandlerを定義

– ネットワークに近いHandlerから順番に定義

Page 19: Apache Camel Netty component

フレーム処理

TCPでは、2つのメッセージを送信した場合、OSは2つではなく、1つのバイト列として扱う

受信側では、電文長やデリミタで識別し、2

つのメッセージに分割する必要あり

Page 20: Apache Camel Netty component

標準のフレーム処理(Decoder)

3つのHandlerを標準で提供

– FixedLengthFrameDecoder

• 固定の電文長で分割

– DelimiterBasedFrameDecoder

• NULL(0x00)や改行コードなどのデリミタで分割

– LengthFieldBasedFrameDecoder

• メッセージのフィールドから電文長を取得し分割

Page 21: Apache Camel Netty component

標準のフレーム処理(Encoder)

1つのHandlerを標準で提供

– LengthFieldPrepender

• 電文長を算出し、メッセージの先頭に付加

• LengthFieldBasedFrameDecoderと組み合わせることが多い

• 先頭以外に電文長を設定する場合は、実装する必要あり

Page 22: Apache Camel Netty component

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

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

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

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

定義例

<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

変換処理

ユーザ実装コンポーネントで扱いやすいように、ChannelBuffer(バイト列)を、文字列やオブジェクトに変換

– ユーザ実装コンポーネントでは、バイト列を意識しない

SSLや圧縮については標準で提供

オブジェクトへの変換は、独自実装が必要

Page 28: Apache Camel Netty component

標準の変換処理(1)

5組のHandlerを提供

– Base64Encoder/Decoder

• Base64でエンコード/デコード

– ZlibEncoder/Decoder

• Deflateアルゴリズムで圧縮/展開

– StringEncoder/Decoder

• 文字列との変換

• デリミタ区切りであれば、「文字列送受信」参照

Page 29: Apache Camel Netty component

標準の変換処理(2)

5組のHandlerを提供

– ObjectEncoder

– ObjectDecoder

• オブジェクトのシリアライズ、デシリアライズ

• 「オブジェクト送受信」参照

– SslHandler

• SSL、TLSおよびstartTLSをサポート

• Apache Camelでオプションを提供しているため、直接使うことはない

Page 30: Apache Camel Netty component

独自実装の変換処理

ユーザ実装のオブジェクトと、ChannelBuffer(バイト列)を変換するには、OneToOneDecoder/OneToOneEncoderを継承する

Page 31: Apache Camel Netty component

ChannelBufferの操作(1)

ChannelBufferのメソッドを使用して、バイト列の取得、設定

ChannelBufferのデフォルトのバイトオーダは、ビッグエンディアン

– 通常、TCP/IPネットワークではネットワークバイトオーダは、ビッグエンディアン

Page 32: Apache Camel Netty component

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

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

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

ExchangeのHeader

Nettyコンシューマは、電文受信時にいくつかの値をHeaderに設定

– “CamelNettyRemoteAddress”

• 送信元のIPアドレス

– “CamelNettyLocalAddress”

• 受信したIPアドレス

SSLに関する値も設定。詳しくは、NettyConstantsを参照

Page 36: Apache Camel Netty component

テキスト通信

Page 37: Apache Camel Netty component

テキストの通信

専用オプションが提供されているため、エンコーダ・デコーダの定義は不要

– プロトコルがTCP

– 文字列形式

– デリミタ区切り

• CR or LFもしくはNULL(0x00)

encoders, decodersは定義しないため、LoggingHandlerなどは設定不可

Page 38: Apache Camel Netty component

専用オプション

テキスト通信専用のオプションを提供

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

文字列⇔モデルの変換

業務処理

レスポンス生成 (one-wayの場合は不要)

ルートの実装

Page 40: Apache Camel Netty component

コンシューマの例

<camelContext xmlns="http://camel.apache.org/schema/spring">

<endpoint id="server"

uri="netty:tcp://0.0.0.0:9999?sync=false&amp;textline=true&amp;delimiter=LINE&amp;

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

プロデューサの例

テキスト形式のメッセージを送信

– 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&amp;textline=true&amp;delimiter=LINE

&amp;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

オブジェクト通信

Page 43: Apache Camel Netty component

ObjectDecoder/Encoder

Nettyでは、オブジェクト通信を行うObjectDecoder、ObjectEncoderを提供

– オブジェクト⇔ChannelBufferの変換

– フレーム処理は不要

– ObjectInput/OutputStreamと互換性なし

• ObjectDecoderとObjectEncoderはペアで使うこと

Page 44: Apache Camel Netty component

コンシューマの例

<camelContext xmlns="http://camel.apache.org/schema/spring">

<endpoint id="server" uri="netty:tcp://0.0.0.0:9999?sync=false&amp;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

SSL通信

Page 46: Apache Camel Netty component

SSL通信の概要

sslオプションをtrueに設定すると、SslHandlerを自動的に追加する

– encoders/decodersに設定は不要

– needClientAuth=trueでクライアント認証

– キーストア、トラストストアは、sslContextParametersオプションで指定

証明書、キーストア、トラストストアは、JavaSEのkeytoolで生成

– 「付録 キー/トラストストアの生成」参照

Page 47: Apache Camel Netty component

コンシューマでのSSLの設定

キーストア、トラストストアを設定

<camelContext xmlns="http://camel.apache.org/schema/spring">

<endpoint id="tcpserverB"

uri="netty:tcp://10.1.1.53:9998?sync=true&amp;decoders=#frameDecoder,#userInfoDecoder&amp;en

coders=#frameEncoder,#userInfoEncoder&amp;ssl=true&amp;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

プロデューサでのSSLの設定

トラストストアを設定

– コンシューマで生成した証明書をインポート<camelContext xmlns="http://camel.apache.org/schema/spring">

<endpoint id="tcpclientB" uri="netty:tcp://10.1.1.53:9998?sync=true&amp;

decoders=#frameDecoder,#userInfoDecoder&amp;encoders=#frameEncoder,#userInfoEncoder&am

p;ssl=true&amp;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

クライアント認証

Apache Camel 2.11以降

コンシューマ・プロデューサともに、キーストア、トラストストアを設定

コンシューマのオプションにneedClientAuth=trueを設定

Page 50: Apache Camel Netty component

付録

Page 51: Apache Camel Netty component

Nettyのログを出力

java.util.loggingがデフォルト

– Camelはslf4jを使用

InternalLoggerFactory#setDefaultFactoryを使用してslf4jに変更

– Camelブート時に実施

InternalLoggerFactory.setDefaultFactory(new Slf4JLoggerFactory());

Page 52: Apache Camel Netty component

電文の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

電文の16進ダンプ (2)

<camelContext xmlns="http://camel.apache.org/schema/spring">

<endpoint id="server" uri="netty:tcp://0.0.0.0:9999?sync=false&amp;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

キー/トラストストアの生成

keytoolを使って、JKSキーストア・トラストストアを生成

– JKSキーストア

• (公開/非公開鍵を持つ) keyEntry

– JKSトラストストア

• (公開鍵のみ) trustedCertEntry

自己署名付き証明書を使用• 証明書署名要求(CSR)を生成して、CAに署名してもらってもOK

Page 55: Apache Camel Netty component

キーストアと自己署名付き証明書の生成

キーストアと自己署名付き証明を生成

– アルゴリズム 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

キーストアの確認$ 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

自己署名付き証明書のエクスポート

キーストアから自己署名付き証明書をエクスポート

$ 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

トラストストアの生成

自己署名付き証明書をトラストストアにインポート

$ 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

トラストストアの確認$ 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

プロデューサのトラストストア

コンシューマで生成した自己署名付き証明書をインポートして、トラストストアを生成

– 「トラストストアの生成」参照

Page 61: Apache Camel Netty component

クライアント認証

プロデューサでも、コンシューマと同様に、キーストア、トラストストア、自己署名付き証明書を生成

コンシューマとプロデューサのトラストストアに、2つの自己署名付き証明書をインポート

keytoolについては、以下を参照

http://docs.oracle.com/javase/jp/7/technotes/guides/security/jsse/JSSERefGuide.html#Cre

ateKeystore