GCPを利用してHyperledger Fabric-CAを作成・ユーザー登録を実行してみた

Hyperledgerを使ったテスト環境ではcryptogenツールを利用して証明書を作成すればいいのですが、実際にビジネスネットワークを作成する場合は認証局を使って動的にユーザの登録認証を行う必要が出てきます。

そこで、今回はGoogle Cloud Platform（GCP）を利用してインスタンス1台にFabric-CAをバイナリからインストールし、簡単に実行できるかテストしてみました。
Dockerで行う場合はFabric-caのimageをPullしてコンテナを作成すれば問題なくできるかと思います。（試してないので間違ってたらごめんなさい。）

# Fabric-caの環境を作成
はじめにインスタンスを1台作成しましょう。
(誰かがCAサーバーのビルド法を投稿してるかと思ってたらそんな記事は見つからなかったのです……)

## インスタンスの作成
[こちら](https://qiita.com/TakashiOshikawa/items/b6536d616fe4e0ab7b36)を参考にインスタンスを作成してください。ただし、HyperledgerはHDDの容量とある程度のマシンパワーをいるので下のスペックあたりに設定して作成してください。

OS　Ubuntu16.04
n1-standard-1（vCPU x 1、メモリ 3.75 GB）
HDD　５０GB
ゾーン　asia-northeast1-a

## sshで接続
まずはGCPのインスタンスにsshでつなぎましょう。ここで、GCPのCLOUD SDKを使用しているPCにインストールしていることを前提に実行していきます。
入れてない場合は通常のsshでもつながるかと思います。#

```bash
gcloud compute ssh <instance名>
```

## 必要となるツールをインストール
Ubuntuですのでapt-getでインストールしていきましょう。

```bash
sudo apt-get update
sudo apt-get install libtool libltdl-dev sqlite3 bison make
# Golangのインストール
# まずはgvmを入れてバージョン管理できるようにする
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
# もしも実行しろって言われた場合は実行してください。
# source ~/.gvm/scripts/gvm
gvm install go1.4 -B
gvm use go1.4
gvm install go1.9.2 -B
gvm use go1.9.2 
gvm install go1.7.2 -B
gvm use go1.7.2 --default
# ここまでで＄GOPATHが設定されているはずです。
# されていない場合は$GOPATHを設定してください。

# Hyperledger Fabric CAのDL
go get -u github.com/hyperledger/fabric-ca/cmd/...
```

ここまででエラーが無ければ正しくCAサーバーが作成されているかと思います。
※Goはバージョンを3つインストールしていますが現在、Fabric CAのネイティブ起動のバージョンが1.0.4が最新でDocker imageでは1.1.0−ｐreviewが最新となっております。1.1.0以前のバージョンではGoのバージョンが1.9以降ですとエラーを吐いてくれますのでGoのバージョンを1.7.xのものをインストールしてください。

# ホームディレクトリの設定
Fabric CAのディレクトリを設定します。　viコマンドで.bashrcを開いてください。

```bash:.bashrc
...
# 使用するホームディレクトリの場所
export FABRIC_CA_HOME=~
# ネットワーク上で識別するためのサーバー名
export FABRIC_CA_SERVER_CA_NAME=<caサーバーの名前>
export FABRIC_CA_SERVER_CA_CERTFILE=<〜.pemファイルまでのpath>
```
あと一つ書き込む環境変数がありますがこれはサーバーの設定を終えたあと書き込みます。

# 設定ファイルの作成と設定
わざわざviで一から書くのは大変なので少し楽をします。

```bash
fabric-ca-server init -b admin:adminpw
ls
rm ○○.pem
rm fabric-ca-server.db
rm -rf msp/*
```
設定ファイルを開き、一部編集します。

```yaml:fabric-ca-config.yaml
…
ca:
  # Name of this CA
  name: <$FABRIC_CA_SERVER_CA_NAMEで決めた名前> # ここを修正
  # Key file (default: ca-key.pem)
  keyfile: ca-key.pem
  # Certificate file (default: ca-cert.pem)
  certfile: ca-cert.pem # .bashrcで.pemの値を変更した場合は修正
  # Chain file (default: chain-cert.pem)
  chainfile: ca-chain.pem
…
```
ここまで設定を終えたらもう一度初期化をします。

```bash
exec bash
fabric-ca-server init -b admin:adminpw
```
lsコマンドでmsp/keystoreの中を確認してください。そのファイル名を環境変数に加えます。

```bash:.bashrc
export FABRIC_CA_SERVER_CA_KEYFILE=<鍵までのpath>
```
サーバーを実行します。

```bash
exec bash
fabric-ca-server start -b admin:adminpw -d
```

# ユーザー証明書の入手とユーザーの追加
今回、ユーザー追加に関してはFabric Sampleのfabcarのソースを利用して行います。
enrollAdmin.js registerUser.jsの次の部分のlocalhostを作成したインスタンスのIPアドレスに変更しましょう。

```js:~.js
fabric_ca_client = new Fabric_CA_Client(…)
```

あとは実行するだけです。

```bash
node enrolleAdmin.js
node registerUser.js
```

# ありえるエラー

```
Failed to register: Error: fabric-ca request register failed with errors [[{"code":0,"message":"Failed getting affiliation 'org1.department1': sql: no rows in result set"}]]
```
エラーメッセージを読めばわかるのですがテーブルに所属させる組織の行がないために起こります。
私が起こしたケースでは設定ファイルが正しくかけていなかったために引き起こしました。
正しい設定ファイルに修正してください。

```
Failed to register: Error: fabric-ca request register failed with errors [[{"code":0,"message":"Identity 'user1' is already registered"}]]
```
2重登録を行おうとすると起こります。
ユーザー名を変えて登録してみてください。

# 最後に
走り書きの勢いで書いてるので誤字脱字や意味がわからないこともあるかと思います。
その時はコメントか何か書いていただければ対応が取れる範囲で反応すると思います。

また、CAサーバーについて詳しく知りたい方は[公式ドキュメント](http://hyperledger-fabric-ca.readthedocs.io/en/latest/index.html)を御覧ください