apache camel netty component
TRANSCRIPT
Apache Camel Nettyコンポーネント@ssogabe
Japan Apache Camel User Group
アジェンダ
Nettyコンポーネントとは
Nettyコンポーネントの基本
テキスト通信
オブジェクト通信
SSL通信
付録
– Nettyのログ出力
– 電文の16進ダンプ
– キー/トラストストアの生成
参考ソース
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
Nettyコンポーネントとは
Nettyを使用したNIOベースのソケット通信を提供
– TCP/UDP、SSL
– 文字列、オブジェクト、バイナリ
コンシューマ/プロデューサを提供
Camel 2.14.xでは、Netty 3.xベースとNetty
4.xベースのコンポーネントを提供
– ここでは、Netty 3.xベースのNettyコンポーネントについて説明
Nettyコンポーネントの基本
URIフォーマット
TCPとUDPをサポート
– netty:tcp://hostname:9999[?options]
– netty:udp://hostname:9999[?options]
TCPとUDPでオプションが異なる
リクエストの種類
one-wayかrequest-responseをサポート
– syncオプションで指定
– ExchangeのBODYがレスポンスになる
Producer Consumer
Producer Consumer
one-way(sync=false)
request-response(sync=true)
フレーム処理、メッセージ変換処理など
– プロトコル、送信形式によって異なる
Nettyコンポーネントの役割
エンコーダ・デコーダの定義
エンコーダ・デコーダに、Handlerを定義し、Nettyコンポーネントの動作を定義
– one-wayの場合は、いずれか1つでもOK
Handler
送信用(エンコーダ)、受信用(デコーダ)および送受信共用の3種類
スレッドセーフでないHandlerも存在するため、使用する場合は工夫が必要
– スレッドセーフなHandlerには、@Sharableが付与
Handlerの種類 (1)
Handlerは、大きく分けて5種類
– フレーム処理
• メッセージの取り出し、メッセージ長の追加
– 変換処理
• Base64、SSL、圧縮、ChannelBuffer⇔文字列/オブジェクトなどの変換を行う
– イベント処理
• 受信したメッセージの処理
• Nettyコンポーネントが実装するため、使用しない
Handlerの種類 (2)
Handlerは、大きく分けて5種類
– アイドル、タイムアウト処理
• アイドル時、タイムアウト時の処理
• Nettyコンポーネントでは使用しない
– その他
• ロギングなど
• Nettyコンポーネントでは使用しない
エンコーダ・デコーダの定義方法
Nettyコンポーネントでは、3種類の定義をサポート
1. encoder/decoder
2. encoders/decoders
3. serverPipelineFactory/clientPipelineFactory
encoders/decodersを推奨
– encoder/decoderは1つしか設定できない
– server/clientPipelineFactoryは、オプションの一部を使えなくなる
Handlerの定義
Spring XMLにHandlerをbeanタグで定義
– ChannelHandlerFactoriesのHandler生成メソッドを使用
• newStringDecoder()/newStringDecoder()
• newObjectDecoder()/newObjectEncoder()
• newDelimiterBasedFrameDecoder()
• newLengthFieldBasedFrameDecoder()
– Handlerがスレッドセーフか考慮する必要なし
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>
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();
}
};
}
}
スレッドセーフの場合
スレッドセーフでない場合
エンコーダ・デコーダの定義例(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の先頭に”#”をつける
– 複数設定する場合はカンマ区切り
– カンマの前後はスペース不要
エンコーダ・デコーダの定義例(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から順番に定義
フレーム処理
TCPでは、2つのメッセージを送信した場合、OSは2つではなく、1つのバイト列として扱う
受信側では、電文長やデリミタで識別し、2
つのメッセージに分割する必要あり
標準のフレーム処理(Decoder)
3つのHandlerを標準で提供
– FixedLengthFrameDecoder
• 固定の電文長で分割
– DelimiterBasedFrameDecoder
• NULL(0x00)や改行コードなどのデリミタで分割
– LengthFieldBasedFrameDecoder
• メッセージのフィールドから電文長を取得し分割
標準のフレーム処理(Encoder)
1つのHandlerを標準で提供
– LengthFieldPrepender
• 電文長を算出し、メッセージの先頭に付加
• LengthFieldBasedFrameDecoderと組み合わせることが多い
• 先頭以外に電文長を設定する場合は、実装する必要あり
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~ペイロードをフレーム分けする
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
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
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
定義例
<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>
変換処理
ユーザ実装コンポーネントで扱いやすいように、ChannelBuffer(バイト列)を、文字列やオブジェクトに変換
– ユーザ実装コンポーネントでは、バイト列を意識しない
SSLや圧縮については標準で提供
オブジェクトへの変換は、独自実装が必要
標準の変換処理(1)
5組のHandlerを提供
– Base64Encoder/Decoder
• Base64でエンコード/デコード
– ZlibEncoder/Decoder
• Deflateアルゴリズムで圧縮/展開
– StringEncoder/Decoder
• 文字列との変換
• デリミタ区切りであれば、「文字列送受信」参照
標準の変換処理(2)
5組のHandlerを提供
– ObjectEncoder
– ObjectDecoder
• オブジェクトのシリアライズ、デシリアライズ
• 「オブジェクト送受信」参照
– SslHandler
• SSL、TLSおよびstartTLSをサポート
• Apache Camelでオプションを提供しているため、直接使うことはない
独自実装の変換処理
ユーザ実装のオブジェクトと、ChannelBuffer(バイト列)を変換するには、OneToOneDecoder/OneToOneEncoderを継承する
ChannelBufferの操作(1)
ChannelBufferのメソッドを使用して、バイト列の取得、設定
ChannelBufferのデフォルトのバイトオーダは、ビッグエンディアン
– 通常、TCP/IPネットワークではネットワークバイトオーダは、ビッグエンディアン
ChannelBufferの操作(2)
ChannelBufferは、読込位置(readerIndex)、書込位置(writerIndex)を管理
– readXXXでバイト列を取得、writeXXXでバイト列を書き込むと、reader/writerIndexが増加
– getXXX/setXXXは、reader/writerIndexは増加しないので注意が必要
– 基本は、readXXX/writeXXXを使用する
0 readerIndex writerIndex
読み書き不可バイト列 読み込み可能バイト列 書き込み可能バイト列
capacity
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;
}}
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);
}
}
ExchangeのHeader
Nettyコンシューマは、電文受信時にいくつかの値をHeaderに設定
– “CamelNettyRemoteAddress”
• 送信元のIPアドレス
– “CamelNettyLocalAddress”
• 受信したIPアドレス
SSLに関する値も設定。詳しくは、NettyConstantsを参照
テキスト通信
テキストの通信
専用オプションが提供されているため、エンコーダ・デコーダの定義は不要
– プロトコルがTCP
– 文字列形式
– デリミタ区切り
• CR or LFもしくはNULL(0x00)
encoders, decodersは定義しないため、LoggingHandlerなどは設定不可
専用オプション
テキスト通信専用のオプションを提供
No. オプション 説明
1 textline テキスト送信の場合true (false)
2 delimiter デリミタ LINE か NULL (LINE)
3 decoderMaxLineLength 最大長 (1024)
4 autoAppenderDelimiter 送信時にデリミタをつけるかどうか
(true)
5 encoding エンコーディング (JVMのデフォルト)
文字列⇔モデルの変換
業務処理
レスポンス生成 (one-wayの場合は不要)
ルートの実装
コンシューマの例
<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
プロデューサの例
テキスト形式のメッセージを送信
– 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>
オブジェクト通信
ObjectDecoder/Encoder
Nettyでは、オブジェクト通信を行うObjectDecoder、ObjectEncoderを提供
– オブジェクト⇔ChannelBufferの変換
– フレーム処理は不要
– ObjectInput/OutputStreamと互換性なし
• ObjectDecoderとObjectEncoderはペアで使うこと
コンシューマの例
<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“ />
SSL通信
SSL通信の概要
sslオプションをtrueに設定すると、SslHandlerを自動的に追加する
– encoders/decodersに設定は不要
– needClientAuth=trueでクライアント認証
– キーストア、トラストストアは、sslContextParametersオプションで指定
証明書、キーストア、トラストストアは、JavaSEのkeytoolで生成
– 「付録 キー/トラストストアの生成」参照
コンシューマでの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>
キーストア
トラストストア
プロデューサでの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>
トラストストア
クライアント認証
Apache Camel 2.11以降
コンシューマ・プロデューサともに、キーストア、トラストストアを設定
コンシューマのオプションにneedClientAuth=trueを設定
付録
Nettyのログを出力
java.util.loggingがデフォルト
– Camelはslf4jを使用
InternalLoggerFactory#setDefaultFactoryを使用してslf4jに変更
– Camelブート時に実施
InternalLoggerFactory.setDefaultFactory(new Slf4JLoggerFactory());
電文の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 |+--------+-------------------------------------------------+----------------+
電文の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>
キー/トラストストアの生成
keytoolを使って、JKSキーストア・トラストストアを生成
– JKSキーストア
• (公開/非公開鍵を持つ) keyEntry
– JKSトラストストア
• (公開鍵のみ) trustedCertEntry
自己署名付き証明書を使用• 証明書署名要求(CSR)を生成して、CAに署名してもらってもOK
キーストアと自己署名付き証明書の生成
キーストアと自己署名付き証明を生成
– アルゴリズム 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を押してください):
キーストアの確認$ 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...]]
自己署名付き証明書のエクスポート
キーストアから自己署名付き証明書をエクスポート
$ 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-----
トラストストアの生成
自己署名付き証明書をトラストストアにインポート
$ 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...]]
この証明書を信頼しますか。 [いいえ]: はい証明書がキーストアに追加されました
トラストストアの確認$ 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...]]
プロデューサのトラストストア
コンシューマで生成した自己署名付き証明書をインポートして、トラストストアを生成
– 「トラストストアの生成」参照
クライアント認証
プロデューサでも、コンシューマと同様に、キーストア、トラストストア、自己署名付き証明書を生成
コンシューマとプロデューサのトラストストアに、2つの自己署名付き証明書をインポート
keytoolについては、以下を参照
http://docs.oracle.com/javase/jp/7/technotes/guides/security/jsse/JSSERefGuide.html#Cre
ateKeystore