Hyperledger Fabricを学ぶ(13回目) サンプルネットワーク「Fabcar」の解説②「ユーザーの証明書取得」
こんにちは。
このブログでは、ブロックチェーン関連を中心としたテック系の情報の紹介をしております。
この連載では、オープンソースのブロックチェーンプラットフォーム「Hyperledger Fabric」について、少しずつ勉強を進めてゆきます。
自分なりに公式のドキュメントを噛み砕きながら、分かり易くまとめて行きたいと思います。
前回(こちら)はサンプルネットワーク「Fabcar」の全体的なシステム構成についてお話しました。
今回は、ネットワーク上の台帳にアクセスするユーザーを作成する際のCAとのやり取りについて説明していこうと思います。
ユーザー登録のプログラム
サンプルでは、「enrollAdmin.js」と「registerUser.js」の2つのプログラムを実行して"admin"と"user1"というユーザーの証明書を取得しています。
「enrollAdmin.js」では"admin"ユーザーの証明書取得を、「registerUser.js」では"user1"のユーザー登録と、証明書の取得を行っています。
ちなみに、Hyperledger Fabricではユーザーの証明書の取得を"enroll"と言います。
ユーザー"admin"の証明書取得
では、実際に「enrollAdmin.js」の中身を見て行きましょう。
// create the key value store as defined in the fabric-client/config/default.json 'key-value-store' setting
Fabric_Client.newDefaultKeyValueStore({ path: store_path
}).then((state_store) => {
// assign the store to the fabric client
fabric_client.setStateStore(state_store);
var crypto_suite = Fabric_Client.newCryptoSuite();
// use the same location for the state store (where the users' certificate are kept)
// and the crypto store (where the users' keys are kept)
var crypto_store = Fabric_Client.newCryptoKeyStore({path: store_path});
crypto_suite.setCryptoKeyStore(crypto_store);
fabric_client.setCryptoSuite(crypto_suite);
var tlsOptions = {
trustedRoots: [],
verify: false
};
// be sure to change the http to https when the CA is running TLS enabled
fabric_ca_client = new Fabric_CA_Client('http://localhost:7054', tlsOptions , 'ca.example.com', crypto_suite);
42行目までに、キーバリューストア(Key Value Store)の作成と、"fabric_client"と"fabric_ca_client"という2つのオブジェクトを作成しています。
キーバリューストアは、CAから取得したユーザーの証明書を保管しておく用のものです。
"fabric_client"はネットワーク上のPeerやOrdererと通信するためのオブジェクトです。作成したキーバリューストアもここに登録され、PeerやOrdererへのアクセスの際に使用されます。
"fabric_ca_client"はネットワーク上のCAと通信するためのオブジェクトです。ここではCAにアクセスしてユーザーの証明書を取得しています。
// first check to see if the admin is already enrolled
return fabric_client.getUserContext('admin', true);
45行目では、既に"admin"ユーザーの証明書がアプリ内に保存されていないか確認しています。
"enrollAdmin.js"の実行が2回目以上であれば、保存されている証明書を使用します。
}).then((user_from_store) => {
if (user_from_store && user_from_store.isEnrolled()) {
console.log('Successfully loaded admin from persistence');
admin_user = user_from_store;
return null;
} else {
// need to enroll it with CA server
return fabric_ca_client.enroll({
enrollmentID: 'admin',
enrollmentSecret: 'adminpw'
}).then((enrollment) => {
console.log('Successfully enrolled admin user "admin"');
return fabric_client.createUser(
{username: 'admin',
mspid: 'Org1MSP',
cryptoContent: { privateKeyPEM: enrollment.key.toBytes(), signedCertPEM: enrollment.certificate }
});
}).then((user) => {
admin_user = user;
return fabric_client.setUserContext(admin_user);
46行目から、CAへの証明書取得の処理が始まります。
47行目のif文の条件内は、保存済みの証明書があった場合の処理です。保存済みに証明書を利用するので処理はここで終了します。
53行目の"enroll()"がCAへの"admin"ユーザーの証明書の取得処理です。ユーザー"admin"は最初からCAに登録されているユーザーなので、ユーザーの登録はせず、adminユーザーのIDとパスワードを渡して、証明書を取得しています。
56行目からは、CAから取得した証明書をfabric_clientオブジェクトに登録する処理です。
ちなみに「enrollAdmin.js」を実行すると、"hfc-key-store"というキーバリューストアのフォルダが作成され、フォルダ内にadminユーザーの証明書が保存されます。
実際にこの"admin"ファイルをテキストエディタで開いてみると、adminユーザーの証明書が出力されているはずです。
ユーザー"user1"の証明書取得
次に「registerUser.js」です。
「registerUser.js」も途中までは「enrollAdmin.js」と処理は同様です。
// at this point we should have the admin user
// first need to register the user with the CA server
return fabric_ca_client.register({enrollmentID: 'user1', affiliation: 'org1.department1', role: 'client'}, admin_user);
「enrollAdmin.js」と異なるのは56行目からです。
ここで、ユーザー"user1"の登録処理"register()"をユーザー"admin"の権限で実行しています。
return fabric_ca_client.enroll({enrollmentID: 'user1', enrollmentSecret: secret});
"user1"の登録後、「enrollAdmin.js」と同様に、今度はユーザー"user1"で"enroll()"を実行して証明書を取得しています。
以降の取得した証明書のfabric_clientへの保存も「enrollAdmin.js」と同様です。
「registerUser.js」の実行後も、"hfc-key-store"フォルダに"user1"という名前で証明書が保存されているはずです。
まとめ
今回は、ネットワークへアクセスするためのユーザー作成において、アプリケーションとCAのやりとりの部分を説明しました。
図にまとめるとこんな感じになると思います。
いつも汚くて。。。すみません。。。
今回は、ネットワーク上の台帳へのアクセスの前段階、アクセスに使用するユーザーの登録において、CAとのやり取りの部分について実際のプログラムの内容を説明しました。
次回は、台帳へのアクセス部分のプログラムについて、説明していこうと思います。
おわり。
この記事が気に入ったらサポートをしてみませんか?