本文是在閱讀《區(qū)塊鏈開發(fā)實(shí)戰(zhàn)-Hyperledger Fabric關(guān)鍵技術(shù)與案例分析》一書的同時(shí),在實(shí)踐中記錄的一些實(shí)踐步驟與經(jīng)驗(yàn)分享。
Hyperledger Fabric開發(fā)實(shí)戰(zhàn)-06 使用SDK
Hyperledger Fabric是一個(gè)聯(lián)盟鏈,其特點(diǎn)是非授權(quán)用戶不能接入,因此,F(xiàn)abric有嚴(yán)格的帳號(hào)體系,用來保證其不可篡改的特性。
在之前的例子中,我看可以看到不管是啟動(dòng)Orderer節(jié)點(diǎn)和Peer節(jié)點(diǎn),還是創(chuàng)建Channel,都需要設(shè)置msp,在規(guī)劃系統(tǒng)的時(shí)候,雖然我們配置固定數(shù)量的節(jié)點(diǎn)和用戶,但是如果系統(tǒng)發(fā)生變化,需要引入新的組織,或者組織中需要增加新的帳號(hào)和用戶,這個(gè)該如何處理呢?
cryptogen模塊對(duì)于這個(gè)問題的解決有一項(xiàng)配置,我們可以重新配置一個(gè)yaml文件,在里面指定起始位置start,例如
PeerOrgs:
- Name: Org1
Domain: org1.cmbc.com
Template:
Count: 3
Start: 2
之前,我們?yōu)镺rg1制定了2個(gè)peer節(jié)點(diǎn),現(xiàn)在的count為3,start為3,說明從2開始,新增3個(gè)
# 原來的
peer0.org1.cmbc.com
peer1.org1.cmbc.com
# 新增的3個(gè)peer
peer2.org1.cmbc.com
peer3.org1.cmbc.com
peer4.org1.cmbc.com
Fabric-ca
Fabric-ca項(xiàng)目是為了專門解決Fabric帳號(hào)問題而開發(fā)的一個(gè)開源項(xiàng)目,由Fabric-ca-server和Fabric-ca-client兩個(gè)模塊組成。
客戶端通過sdk訪問peer節(jié)點(diǎn)之前,首先要通過CA Intermediate Server的驗(yàn)證。
編譯和安裝
準(zhǔn)備
首先需要安裝系統(tǒng)相關(guān)依賴,我們使用sqlite3作為ca-server的數(shù)據(jù)庫存儲(chǔ)
sudo apt-get install libtool libltdl-dev
sudo apt-get install sqlite3
下載并編譯
由于我們使用的是v1.1.0版本,為了保持一致性,ca上依然使用這個(gè)版本
cd $GOPATH/src/github.com/hyperledger
git clone http://gerrit.hyperledger.org//r/fabric-ca
cd $GOPATH/src/github.com/hyperledger/fabric-ca
git checkout v1.1.0
make fabric-ca-server
make fabric-ca-client
# 為了便于使用,拷貝到usr目錄下
sudo cp $GOPATH/src/github.com/hyperledger/fabric-ca/bin/* /usr/local/bin
chmod -R 775 /usr/local/bin/fabric-ca-server
chmod -R 775 /usr/local/bin/fabric-ca-client
檢查
fabric-ca-server version
fabric-ca-client version
啟動(dòng)
初始化
fabric-ca-server的init子命令用于初始化生成相關(guān)的配置文件
# 創(chuàng)建工作目錄
mkdir ~/fabricwksp/04-ca/server
cd ~/fabricwksp/04-ca/server
# 生成配置文件,-b指定了ca-server的用戶名和密碼
fabric-ca-server init -b admin:adminpw
修改配置
主要的配置文件是目錄系的fabric-ca-server-config.yaml文件,里面包含了ca-server的端口,調(diào)試模式,tls,ca,db等信息。我們所需要做的是將ca-server綁定到現(xiàn)有的組織中,在前面例子的基礎(chǔ)上,我們綁定到Org1上,需要修改ca部分,將Org1的證書設(shè)置進(jìn)去
ca:
name: ca-org1
keyfile: /home/ssj234/fabricwksp/02-helloworld/fabricconfig/crypto-config/peerOrganizations/org1.cmbc.com/ca/9284b1b376bd6291d1c7e9b23902d6b6f660663241e2139e7093608f04198820_sk
certfile: /home/ssj234/fabricwksp/02-helloworld/fabricconfig/crypto-config/peerOrganizations/org1.cmbc.com/ca/ca.org1.cmbc.com-cert.pem
chainfile: ca-chain.pem
啟動(dòng)ca-server
使用fabric-ca-server的start子命令啟動(dòng)服務(wù)器,需要制定配置文件所在的目錄
fabric-ca-server start -H /home/ssj234/fabricwksp/04-ca/server --boot admin:adminpw
client的使用
通過Client,可以生成帳號(hào),由于ca-server綁定的是Org1的證書,那么動(dòng)態(tài)生成的帳號(hào)也就是Org1下的用戶了。
設(shè)置目錄
生產(chǎn)的帳號(hào)需要保存相關(guān)證書,因此,先生成一個(gè)文件夾保存這些證書
mkdir ~/fabricwksp/04-ca/client
使用enroll登記帳號(hào)
enroll會(huì)利用管理員帳號(hào)和密碼注冊(cè),并獲得管理員的MSP證書
export FABRIC_CA_CLIENT_HOME=/home/ssj234/fabricwksp/04-ca/client
fabric-ca-client enroll -M /home/ssj234/fabricwksp/04-ca/client -u http://admin:adminpw@localhost:7054
執(zhí)行完命令后,我們會(huì)在client文件夾看到生成的相關(guān)文件
注冊(cè)帳號(hào)
注冊(cè)一個(gè)新的帳號(hào)peer4,密碼為peer4pw,部門為org1.department1
fabric-ca-client register --id.name peer4 --id.type peer --id.affiliation org1.department1 --id.secret peer4pw -u http://localhost:7054
獲取peer4的證書
首先,創(chuàng)建一個(gè)目錄,用來保存peer4的msp
mkdir -p ~/fabricwksp/04-ca/peer4/msp/admincerts
執(zhí)行enroll獲取證書
fabric-ca-client enroll -M /home/ssj234/fabricwksp/04-ca/peer4/msp -u http://peer4:peer4pw@localhost:7054
復(fù)制管理員前面到peer4目錄
cp /home/ssj234/fabricwksp/02-helloworld/fabricconfig/crypto-config/peerOrganizations/org1.cmbc.com/users/Admin@org1.cmbc.com/msp/signcerts/* ~/fabricwksp/04-ca/peer4/msp/admincerts
將共用TLS簽名證書拷貝到peer4目錄下
mkdir -p ~/fabricwksp/04-ca/peer4/tls
cp /home/ssj234/fabricwksp/02-helloworld/fabricconfig/crypto-config/peerOrganizations/org1.cmbc.com/peers/peer0.org1.cmbc.com/tls/* ~/fabricwksp/04-ca/peer4/tls
在peer4的目錄下,可以看到如下結(jié)構(gòu),這跟我們通過cryptogen生成的賬號(hào)文件是一致的
├── msp
│ ├── admincerts
│ │ └── Admin@org1.cmbc.com-cert.pem
│ ├── cacerts
│ │ └── localhost-7054.pem
│ ├── intermediatecerts
│ │ └── localhost-7054.pem
│ ├── keystore
│ │ └── 75800c7f0f57af0eea8edfa8dc53fff45a3f98bb13281c645f18145b0c39d460_sk
│ └── signcerts
│ └── cert.pem
└── tls
├── ca.crt
├── server.crt
└── server.key