之前介紹了使用官方腳本自動化啟動一個Fabric網絡,並且所有的證書都是通過官方的命令行工具cryptogen
直接生成網絡中的所有節點的證書。在開發環境可以這么簡單進行,但是生成環境下還是需要我們自定義對網絡中的節點的證書進行配置。
所以在本文中,將會詳細介紹一個從手動生成證書一直到啟動網絡的整體步驟。本文只交代整體的搭建步驟。對於Fabric-Ca的講解不在本文的范圍內,將在另一篇文章中說明。
正篇文章也是根據官方的文檔進行的。但是由於官方的文檔尚未完工,也是好多沒有交代清楚的,並且有些地方是錯誤的,所以筆者也是一步一步摸索出來的,所以如果本文哪里沒有交代清楚或者錯誤的地方,希望各位批評指正。
在這里貼出官方文檔地址.
1.整體架構
架構圖直接貼過來好了:
官方文檔采用的是多機環境,這里簡潔化一點,所有的操作都在一台機器上進行,至於多機環境,以后再補充好了。
介紹一下本文所采用的整體架構:
- 三個組織
- Org0 -> 組織0
- Org1 -> 組織1
- Org2 -> 組織2
- 組織中的成員
- Org0 一個Orderer節點,一個Org0的Admin節點
- Org1 兩個Peer節點,一個Org1的Admin節點,一個Org1的User節點
- Org2 兩個Peer節點,一個Org2的Admin節點,一個Org2的User節點
- 共有四台CA服務器
- TLS服務器 -> 為網絡中所有節點頒發TLS證書,用於通信的加密
- Org1的CA服務器 -> 為組織1中所有用戶頒發證書
- Org2的Ca服務器 -> 為組織2中所有用戶頒發證書
- Org0的CA服務器 -> 為組織0中所有用戶頒發證書
這里的四台CA服務器都是根服務器。彼此之間都是獨立的存在,沒有任何關系。,也就是說每一個CA服務器生成的證書在其他CA服務器都是不能用的。
介紹完之后,可以進入正題了。
1.1Fabric,Fabric-Ca安裝
本文默認讀者都是對Fabric有一定的了解的,所以一些安裝過程這里就沒有重復說明。
第一步是安裝Fabric-Ca環境,可以參考這里,這篇文章還沒有寫完,以后慢慢補,不過環境的安裝已經有說明。
還有就是Fabric的環境安裝,可以參考這里。
完成環境搭建后,我們還需要一個HOME
文件夾,用於存放我們生成的證書文件與fabric
配置相關的文件。
本文設置HOME
文件夾路徑為:
$GOPATH/src/github.com/caDemo/
請讀者自行創建,一般不要用太復雜的路徑,也不要用中文路徑,會為之后的操作帶來很多麻煩。在下文中簡單稱HOME
文件夾為工作目錄,除非特殊說明,一般命令的執行都是在工作目錄進行。
2 CA服務器配置
2.1啟動TLS CA服務器
前期工作准備好之后,我們開始啟動第一台CA服務器。本文中使用Docker
容器啟動。
首先在工作目錄創建docker-compose.yaml
文件:
touch docker-compose.yaml
並在文件內添加以下內容(tips:內容格式不要亂掉):
version: '2'
networks:
fabric-ca:
services:
ca-tls:
container_name: ca-tls
image: hyperledger/fabric-ca
command: sh -c 'fabric-ca-server start -d -b tls-ca-admin:tls-ca-adminpw --port 7052'
environment:
- FABRIC_CA_SERVER_HOME=/ca/tls
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_CSR_CN=ca-tls
- FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
- FABRIC_CA_SERVER_DEBUG=true
volumes:
- $GOPATH/src/github.com/caDemo:/ca ##重要!!!記得修改這里的路徑為自己的工作目錄
networks:
- fabric-ca
ports:
- 7052:7052
啟動該docker
容器:
docker-compose -f docker-compose.yaml up ca-tls
如果命令行出現以下內容則說明啟動成功:
[INFO] Listening on https://0.0.0.0:7052
同時工作目錄下會出現一個tls
的文件夾。文件夾中的內容暫先不解釋,留着在另一篇文章中說明。不過有一個文件需要解釋一下,因為之后會用到。
在$GOPATH/src/github.com/caDemo/tls/
路徑下的ca-cert.pem
文件。這是TLS CA
服務器簽名的根證書,目的是用來對CA
的TLS
證書進行驗證,同時也需要持有這個證書才可以進行證書的頒發。在多機環境下,我們需要將它復制到每一台機器上,不過本文采用的是單機環境,所以省略掉了這一步。
2.2 TLS CA服務器注冊用戶
第一步是在TLS CA服務器中注冊用戶,經過注冊的用戶才擁有TLS證書,本文中由於只在各節點之間進行TLS加密通信,所以只將orderer
和peer
節點的身份注冊到TLS服務器。
打開一個新的終端輸入以下命令:
#設置環境變量指定根證書的路徑(如果工作目錄不同的話記得指定自己的工作目錄,以下不再重復說明)
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/tls/ca-cert.pem
#設置環境變量指定CA客戶端的HOME文件夾
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/tls/admin
#登錄管理員用戶用於之后的節點身份注冊
fabric-ca-client enroll -d -u https://tls-ca-admin:tls-ca-adminpw@0.0.0.0:7052
登錄成功在工作目錄下的tls
文件夾下將出現一個admin
文件夾,這里面是admin
的相關證書文件.
並且只有登錄了admin
,才具有權限進行用戶的注冊,因為該用戶具有CA的全部權限,相當於CA服務器的root
用戶。
接下來對各個節點進行注冊。
fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer2-org1 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer1-org2 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer2-org2 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name orderer-org0 --id.secret ordererPW --id.type orderer -u https://0.0.0.0:7052
這里將三個組織中的節點都進行了注冊。
- 不過
-d
這個參數並沒有找到相關資料 id.name
是指定用戶的名稱--id.secert
是指定密碼--id.type
是指定用戶類型,用戶類型默認為client
,主要包括peer
,app
,user
,orderer
.-u
則是指定請求CA服務器的URL。
這里我們為各個節點注冊TLS證書,之后Fabric網絡的通信則需要通過這一步驟注冊過的用戶的TLS證書來進行TLS加密通信。
到這里我們只是注冊了各個節點的身份,還沒有獲取到他們的證書。證書可以通過登錄獲取,不過暫時不着急獲取他們的TLS證書。
接下來,我們對其他幾個CA服務器進行配置。
2.3配置Org0的CA服務器
再強調一下,本文中的幾個CA服務器都是根服務器,彼此之間沒有任何關系,所以上一步驟的TLS CA服務器在這一部分並沒有用到。
同樣,本文使用Docker容器啟動CA服務器。配置文件如下,只需要添加進之前的docker-compose.yaml
文件中就好:
org0:
container_name: org0
image: hyperledger/fabric-ca
command: /bin/bash -c 'fabric-ca-server start -d -b org0-admin:org0-adminpw --port 7053'
environment:
- FABRIC_CA_SERVER_HOME=/ca/org0/crypto
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_CSR_CN=org0
- FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
- FABRIC_CA_SERVER_DEBUG=true
volumes:
- $GOPATH/src/github.com/caDemo:/ca
networks:
- fabric-ca
ports:
- 7053:7053
添加完之后啟動它:
docker-compose -f docker-compose.yaml up org0
打開另一個終端,接下來注冊org0的用戶:
#首先指定環境變量,這里的TLS證書不是之前的TLS CA服務器的根證書,而是本組織CA服務器啟動時生成的TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org0/crypto/ca-cert.pem
#指定本組織的CA客戶端工作目錄
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org0/admin
登錄org0
的CA服務器管理員身份用於注冊本組織的用戶:
fabric-ca-client enroll -d -u https://org0-admin:org0-adminpw@0.0.0.0:7053
在本組織中共有兩個用戶:orderer
節點和admin
用戶(這里的admin和管理員是不同的。)
將他們注冊到org0的CA服務器:
fabric-ca-client register -d --id.name orderer-org0 --id.secret ordererpw --id.type orderer -u https://0.0.0.0:7053
fabric-ca-client register -d --id.name admin-org0 --id.secret org0adminpw --id.type admin --id.attrs "hf.Registrar.Roles=client,hf.Registrar.Attributes=*,hf.Revoker=true,hf.GenCRL=true,admin=true:ecert,abac.init=true:ecert" -u https://0.0.0.0:7053
命令執行完之后,將會注冊一個Orderer節點的身份和一個Admin的身份。同時在工作目錄下的org0
子文件夾中會有兩個文件夾:crypto
和admin
。crypto
中是CA服務器的配置信息,admin
是服務器管理員的身份信息。
2.4配置Org1的CA服務器
同樣的步驟,對org1組織的CA服務器進行配置:
org1:
container_name: org1
image: hyperledger/fabric-ca
command: /bin/bash -c 'fabric-ca-server start -d -b org1-admin:org1-adminpw'
environment:
- FABRIC_CA_SERVER_HOME=/ca/org1/crypto
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_CSR_CN=org1
- FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
- FABRIC_CA_SERVER_DEBUG=true
volumes:
- $GOPATH/src/github.com/caDemo:/ca
networks:
- fabric-ca
ports:
- 7054:7054
啟動服務器:
docker-compose -f docker-compose.yaml up org1
打開新的終端,配置環境變量:
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org1/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org1/admin
登錄CA服務器管理員身份:
fabric-ca-client enroll -d -u https://org1-admin:org1-adminpw@0.0.0.0:7054
組織一種共有四個用戶:peer1
,peer2
,admin
,user
,分別注冊他們:
fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name peer2-org1 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name admin-org1 --id.secret org1AdminPW --id.type user -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name user-org1 --id.secret org1UserPW --id.type user -u https://0.0.0.0:7054
2.5配置Org2的CA服務器
和上一部分相同,這里只列舉需要的命令:
CA服務器配置文件:
org2:
container_name: org2
image: hyperledger/fabric-ca
command: /bin/bash -c 'fabric-ca-server start -d -b org2-admin:org2-adminpw --port 7055'
environment:
- FABRIC_CA_SERVER_HOME=/ca/org2/crypto
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_CSR_CN=org2
- FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
- FABRIC_CA_SERVER_DEBUG=true
volumes:
- $GOPATH/src/github.com/caDemo:/ca
networks:
- fabric-ca
ports:
- 7055:7055
啟動服務器:
docker-compose -f docker-compose.yaml up org2
打開新的終端,配置環境變量:
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org2/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org2/admin
登錄CA服務器管理員身份:
fabric-ca-client enroll -d -u https://org2-admin:org2-adminpw@0.0.0.0:7055
組織一種共有四個用戶:peer1
,peer2
,admin
,user
,分別注冊他們:
fabric-ca-client register -d --id.name peer1-org2 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7055
fabric-ca-client register -d --id.name peer2-org2 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7055
fabric-ca-client register -d --id.name admin-org2 --id.secret org1AdminPW --id.type user -u https://0.0.0.0:7055
fabric-ca-client register -d --id.name user-org2 --id.secret org1UserPW --id.type user -u https://0.0.0.0:7055
3.生成證書並配置TLS
到目前為止,所有的用戶我們都注冊完畢,接下來就是為每一個用戶生成證書並配置TLS證書。
其中證書分為兩部分,分別是本組織的MSP證書,以及組織之間進行加密通信的TLS證書。
所以本文需要對兩部分證書進行分別生成與配置。
從組織一開始:
3.1 組織一節點配置
3.1.1 peer1
首先是本組織的MSP
證書:
- 配置環境變量
#指定peer1節點的HOME目錄
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org1/peer1
#指定**本**組織的TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org1/crypto/ca-cert.pem
- 登錄
peer1
節點到org1 CA
服務器上:
fabric-ca-client enroll -d -u https://peer1-org1:peer1PW@0.0.0.0:7054
這一步完成后,在$GOPATH/src/github.com/caDemo/org1/peer1
下會出現一個msp
文件夾,這是peer1
節點的MSP
證書。
接下來是TLS
證書:
- 配置環境變量
#指定TLS CA服務器生成的TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/tls/ca-cert.pem
#指定TLS證書的HOME目錄
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org1/peer1/tls-msp
- 登錄
peer1
節點到TLS CA
服務器上:
fabric-ca-client enroll -d -u https://peer1-org1:peer1PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer1-org1
這一步完成后,在$GOPATH/src/github.com/caDemo/org1/peer1
下會出現一個tls-msp
文件夾,這是peer1
節點的TLS
證書。
- 修改秘鑰文件名
為什么要修改呢,進入這個文件夾看一下就知道了,由服務器生成的秘鑰文件名是一長串無規則的字符串,后期我們使用的時候難道要一個字符一個字符地輸入?
cd $GOPATH/src/github.com/caDemo/org1/peer1/tls-msp/keystore/
mv *_sk key.pem
#修改完回到工作目錄
cd $GOPATH/src/github.com/caDemo
3.1.2 peer2
peer2
節點和上面步驟相同:
這里就直接放需要的命令了:
- 生成
MSP
證書
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org1/peer2
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org1/crypto/ca-cert.pem
fabric-ca-client enroll -d -u https://peer2-org1:peer2PW@0.0.0.0:7054
- 生成
TLS
證書
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org1/peer2/tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/tls/ca-cert.pem
fabric-ca-client enroll -d -u https://peer2-org1:peer2PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer2-org1
cd $GOPATH/src/github.com/caDemo/org1/peer2/tls-msp/keystore/
mv *_sk key.pem
3.1.3 admin
接下來是admin
用戶,這個用戶有什么作用呢,實際上,安裝和實例化鏈碼都需要admin
的證書,所以才需要注冊一個admin
用戶,還要它的證書。
- 配置環境變量
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org1/adminuser
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org1/crypto/ca-cert.pem
#這里多了一個環境變量,是指定admin用戶的msp證書文件夾的
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org1/adminuser/msp
- 登錄
admin
用戶獲取MSP
證書:
fabric-ca-client enroll -d -u https://admin-org1:org1AdminPW@0.0.0.0:7054
因為我們生成這個用戶的證書主要就是為了之后鏈碼的安裝和實例化,所以配不配置他的TLS
證書也無關緊要了(關鍵是我們之前也沒有將這個用戶注冊到tls
服務器中)
- 復制證書到
admincerts
文件夾:
去看Fabric官方的例子,每一個peer
節點的MSP
文件夾下都有admincerts
這個子文件夾的,而且是需要我們手動創建的。
mkdir -p $GOPATH/src/github.com/caDemo/org1/peer1/msp/admincerts
#將簽名證書拷貝過去
cp $GOPATH/src/github.com/caDemo/org1/adminuser/msp/signcerts/cert.pem $GOPATH/src/github.com/caDemo/org1/peer1/msp/admincerts/org1-admin-cert.pem
#回到工作目錄
cd $GOPATH/src/github.com/caDemo/
3.1.4 啟動peer節點
到這里,已經配置好了一個節點,所以我們就可以啟動這個節點了,當然在之后和orderer
節點一起啟動也可以,不過忙活了這么多,還是應該提前看到一下所做的工作的成果的!
附上peer1
節點的容器配置信息:
peer1-org1:
container_name: peer1-org1
image: hyperledger/fabric-peer
environment:
- CORE_PEER_ID=peer1-org1
- CORE_PEER_ADDRESS=peer1-org1:7051
- CORE_PEER_LOCALMSPID=org1MSP
- CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/peer1/msp
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=cademo_fabric-ca
- FABRIC_LOGGING_SPEC=debug
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/signcerts/cert.pem
- CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org1/peer1/tls-msp/keystore/key.pem
- CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-org1:7051
- CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org1/peer1
volumes:
- /var/run:/host/var/run
- $GOPATH/src/github.com/caDemo/org1/peer1:/tmp/hyperledger/org1/peer1
networks:
- fabric-ca
啟動它!!
docker-compose -f docker-compose.yaml up peer1-org1
如果沒有報錯的話,說明之前配置的沒有什么問題,如果出錯的話,則需要返回去檢查一下了。。。
peer2
節點的容器配置信息:
peer2-org1:
container_name: peer2-org1
image: hyperledger/fabric-peer
environment:
- CORE_PEER_ID=peer2-org1
- CORE_PEER_ADDRESS=peer2-org1:8051
- CORE_PEER_LOCALMSPID=org1MSP
- CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/peer2/msp
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=cademo_fabric-ca
- FABRIC_LOGGING_SPEC=debug
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org1/peer2/tls-msp/signcerts/cert.pem
- CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org1/peer2/tls-msp/keystore/key.pem
- CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org1/peer2/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-org1:7051
- CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org1/peer2
volumes:
- /var/run:/host/var/run
- $GOPATH/src/github.com/caDemo/org1/peer2:/tmp/hyperledger/org1/peer2
networks:
- fabric-ca
啟動它!!
docker-compose -f docker-compose.yaml up peer2-org1
3.2 組織二節點配置
和之前一樣的步驟,所以沒什么好解釋的了:
3.2.1 peer1
- 配置環境變量
#指定peer2節點的HOME目錄
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org2/peer1
#指定本組織的TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org2/crypto/ca-cert.pem
- 登錄
peer1
節點到org2 CA
服務器上:
fabric-ca-client enroll -d -u https://peer1-org2:peer1PW@0.0.0.0:7055
接下來是TLS
證書:
- 配置環境變量
#指定TLS CA服務器生成的TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/tls/ca-cert.pem
#指定TLS證書的HOME目錄
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org2/peer1/tls-msp
- 登錄
peer1
節點到TLS CA
服務器上:
fabric-ca-client enroll -d -u https://peer1-org2:peer1PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer1-org2
- 修改秘鑰文件名
cd $GOPATH/src/github.com/caDemo/org2/peer1/tls-msp/keystore/
mv *_sk key.pem
#修改完回到工作目錄
cd $GOPATH/src/github.com/caDemo
3.2.2 peer2
- 生成
MSP
證書
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org2/peer2
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org2/crypto/ca-cert.pem
fabric-ca-client enroll -d -u https://peer2-org2:peer2PW@0.0.0.0:7055
- 生成
TLS
證書
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org2/peer2/tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/tls/ca-cert.pem
fabric-ca-client enroll -d -u https://peer2-org2:peer2PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer2-org2
cd $GOPATH/src/github.com/caDemo/org2/peer2/tls-msp/keystore/
mv *_sk key.pem
3.2.3 admin
- 配置環境變量
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org2/adminuser
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org2/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org2/adminuser/msp
- 登錄
admin
用戶獲取MSP
證書:
fabric-ca-client enroll -d -u https://admin-org2:org2AdminPW@0.0.0.0:7055
- 復制證書到
admincerts
文件夾:
去看Fabric官方的例子,每一個peer
節點的MSP
文件夾下都有admincerts
這個子文件夾的,而且是需要我們手動創建的。
mkdir -p $GOPATH/src/github.com/caDemo/org2/peer1/msp/admincerts
#將簽名證書拷貝過去
cp $GOPATH/src/github.com/caDemo/org2/adminuser/msp/signcerts/cert.pem $GOPATH/src/github.com/caDemo/org2/peer1/msp/admincerts/org2-admin-cert.pem
#回到工作目錄
cd $GOPATH/src/github.com/caDemo/
3.2.4 啟動peer節點
附上peer1
節點的容器配置信息:
peer1-org2:
container_name: peer1-org2
image: hyperledger/fabric-peer
environment:
- CORE_PEER_ID=peer1-org2
- CORE_PEER_ADDRESS=peer1-org2:9051
- CORE_PEER_LOCALMSPID=org2MSP
- CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/peer1/msp
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=cademo_fabric-ca
- FABRIC_LOGGING_SPEC=debug
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org2/peer1/tls-msp/signcerts/cert.pem
- CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org2/peer1/tls-msp/keystore/key.pem
- CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org2/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-org2:9051
- CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org2/peer1
volumes:
- /var/run:/host/var/run
- $GOPATH/src/github.com/caDemo/org2/peer1:/tmp/hyperledger/org2/peer1
networks:
- fabric-ca
啟動它.
docker-compose -f docker-compose.yaml up peer1-org2
peer2
節點的容器配置信息:
peer2-org2:
container_name: peer2-org2
image: hyperledger/fabric-peer
environment:
- CORE_PEER_ID=peer2-org2
- CORE_PEER_ADDRESS=peer2-org2:10051
- CORE_PEER_LOCALMSPID=org2MSP
- CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/peer2/msp
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=cademo_fabric-ca
- FABRIC_LOGGING_SPEC=debug
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org2/peer2/tls-msp/signcerts/cert.pem
- CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org2/peer2/tls-msp/keystore/key.pem
- CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org2/peer2/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
- CORE_PEER_GOSSIP_USELEADERELECTION=true
- CORE_PEER_GOSSIP_ORGLEADER=false
- CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-org2:9051
- CORE_PEER_GOSSIP_SKIPHANDSHAKE=true
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org2/peer2
volumes:
- /var/run:/host/var/run
- $GOPATH/src/github.com/caDemo/org2/peer2:/tmp/hyperledger/org2/peer2
networks:
- fabric-ca
啟動它.
docker-compose -f docker-compose.yaml up peer2-org2
3.3 排序節點配置
接下來是排序節點的配置,為什么放在最后面呢,因為排序節點的啟動需要提前生成創世區塊,而創世區塊的生成涉及到另一個配置文件,所以就先配置簡單的peer
節點。
3.3.1 orderer
- 配置環境變量
#指定order節點的HOME目錄
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org0/orderer
#指定本組織的TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org0/crypto/ca-cert.pem
- 登錄
order
節點到org0 CA
服務器上:
fabric-ca-client enroll -d -u https://orderer-org0:ordererpw@0.0.0.0:7053
接下來是TLS
證書:
- 配置環境變量
#指定TLS CA服務器生成的TLS根證書
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org0/orderer/tls-msp
#指定TLS根證書
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/tls/ca-cert.pem
- 登錄
orderer
節點到TLS CA
服務器上:
fabric-ca-client enroll -d -u https://orderer-org0:ordererPW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts orderer-org0
- 修改秘鑰文件名
cd $GOPATH/src/github.com/caDemo/org0/orderer/tls-msp/keystore/
mv *_sk key.pem
#修改完回到工作目錄
cd $GOPATH/src/github.com/caDemo
3.3.2 admin
- 配置環境變量
export FABRIC_CA_CLIENT_HOME=$GOPATH/src/github.com/caDemo/org0/adminuser
export FABRIC_CA_CLIENT_TLS_CERTFILES=$GOPATH/src/github.com/caDemo/org0/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=$GOPATH/src/github.com/caDemo/org0/adminuser/msp
- 登錄
admin
用戶獲取MSP
證書:
fabric-ca-client enroll -d -u https://admin-org0:org0adminpw@0.0.0.0:7053
- 復制證書到
admincerts
文件夾:
mkdir $GOPATH/src/github.com/caDemo/org0/orderer/msp/admincerts
#將簽名證書拷貝過去
cp $GOPATH/src/github.com/caDemo/org0/adminuser/msp/signcerts/cert.pem $GOPATH/src/github.com/caDemo/org0/orderer/msp/admincerts/orderer-admin-cert.pem
#回到工作目錄
cd $GOPATH/src/github.com/caDemo/
4.Fabric網絡配置
接下來到重頭戲了,證書都生成好了,即將要啟動網絡了。不過在啟動網絡之前還是有很多准備工作需要做。其實到這里,官方文檔已經好多沒有交代清楚的了,所以一下好多內容都是筆者自己摸索出來的,如有錯誤歡迎批評指正。
4.1 configtx.yaml文件配置
在下一個步驟的生成創世區塊和通道配置信息需要一個文件:configtx.yaml
文件。筆者根據官方的例子按照本文內容修改了一下,直接放在工作目錄:
Organizations:
- &orderer-org0
Name: orderer-org0
ID: org0MSP
MSPDir: ./org0/msp
# Policies:
# Readers:
# Type: Signature
# Rule: "OR('orderer-org0MSP.member')"
# Writers:
# Type: Signature
# Rule: "OR('orderer-org0MSP.member')"
# Admins:
# Type: Signature
# Rule: "OR('orderer-org0MSP.admin')"
- &org1
Name: org1MSP
ID: org1MSP
MSPDir: ./org1/msp
# Policies:
# Readers:
# Type: Signature
# Rule: "OR('org1MSP.admin', 'org1MSP.peer', 'org1MSP.client')"
# Writers:
# Type: Signature
# Rule: "OR('org1MSP.admin', 'org1MSP.client')"
# Admins:
# Type: Signature
# Rule: "OR('org1MSP.admin')"
AnchorPeers:
- Host: peer1-org1
Port: 7051
- &org2
Name: org2MSP
ID: org2MSP
MSPDir: ./org2/msp
# Policies:
# Readers:
# Type: Signature
# Rule: "OR('org2MSP.admin', 'org2MSP.peer', 'org2MSP.client')"
# Writers:
# Type: Signature
# Rule: "OR('org2MSP.admin', 'org2MSP.client')"
# Admins:
# Type: Signature
# Rule: "OR('org2MSP.admin')"
AnchorPeers:
- Host: peer1-org2
Port: 9051
Capabilities:
Channel: &ChannelCapabilities
V1_4_3: true
V1_3: false
V1_1: false
Orderer: &OrdererCapabilities
V1_4_2: true
V1_1: false
Application: &ApplicationCapabilities
V1_4_2: true
V1_3: false
V1_2: false
V1_1: false
Application: &ApplicationDefaults
Organizations:
# Policies:
# Readers:
# Type: ImplicitMeta
# Rule: "ANY Readers"
# Writers:
# Type: ImplicitMeta
# Rule: "ANY Writers"
# Admins:
# Type: ImplicitMeta
# Rule: "MAJORITY Admins"
Capabilities:
<<: *ApplicationCapabilities
Orderer: &OrdererDefaults
OrdererType: solo
Addresses:
- orderer-org0:7050
BatchTimeout: 2s
BatchSize:
MaxMessageCount: 10
AbsoluteMaxBytes: 99 MB
PreferredMaxBytes: 512 KB
Organizations:
# Policies:
# Readers:
# Type: ImplicitMeta
# Rule: "ANY Readers"
# Writers:
# Type: ImplicitMeta
# Rule: "ANY Writers"
# Admins:
# Type: ImplicitMeta
# Rule: "MAJORITY Admins"
# # BlockValidation specifies what signatures must be included in the block
# # from the orderer for the peer to validate it.
# BlockValidation:
# Type: ImplicitMeta
# Rule: "ANY Writers"
Channel: &ChannelDefaults
# Policies:
# # Who may invoke the 'Deliver' API
# Readers:
# Type: ImplicitMeta
# Rule: "ANY Readers"
# # Who may invoke the 'Broadcast' API
# Writers:
# Type: ImplicitMeta
# Rule: "ANY Writers"
# # By default, who may modify elements at this config level
# Admins:
# Type: ImplicitMeta
# Rule: "MAJORITY Admins"
Capabilities:
<<: *ChannelCapabilities
Profiles:
TwoOrgsOrdererGenesis:
<<: *ChannelDefaults
Orderer:
<<: *OrdererDefaults
Organizations:
- *orderer-org0
Capabilities:
<<: *OrdererCapabilities
Consortiums:
SampleConsortium:
Organizations:
- *org1
- *org2
TwoOrgsChannel:
Consortium: SampleConsortium
<<: *ChannelDefaults
Application:
<<: *ApplicationDefaults
Organizations:
- *org1
- *org2
Capabilities:
<<: *ApplicationCapabilities
注釋掉的部分是策略部分,筆者還沒有完全搞懂,所以索性就先注釋掉了,以后搞懂了再添加進去。
還有一部分msp
需要配置,就是configtx.yaml
文件中第一部分指定的MSPDir
,很簡單,按照一下命令復制一下就好了:
#進入工作目錄
cd $GOPATH/src/github.com/caDemo
############################################
#org0
mkdir org0/msp && cd org0/msp
mkdir admincerts && mkdir cacerts && mkdir tlscacerts
cd $GOPATH/src/github.com/caDemo
cp adminuser/msp/signcerts/cert.pem msp/admincerts/ca-cert.pem
cp crypto/ca-cert.pem msp/cacerts/ca-cert.pem
cp ../tls/ca-cert.pem msp/tlscacerts/ca-cert.pem
############################################
#org1
cd $GOPATH/src/github.com/caDemo
mkdir org1/msp/ && cd org1/msp/
mkdir admincerts && mkdir cacerts && mkdir tlscacerts
cd $GOPATH/src/github.com/caDemo
cp adminuser/msp/signcerts/cert.pem msp/admincerts/ca-cert.pem
cp crypto/ca-cert.pem msp/cacerts/ca-cert.pem
cp ../tls/ca-cert.pem msp/tlscacerts/ca-cert.pem
############################################
#org2
cd $GOPATH/src/github.com/caDemo
mkdir org1/msp/ && cd org1/msp/
mkdir admincerts && mkdir cacerts && mkdir tlscacerts
cd $GOPATH/src/github.com/caDemo
cp adminuser/msp/signcerts/cert.pem msp/admincerts/ca-cert.pem
cp crypto/ca-cert.pem msp/cacerts/ca-cert.pem
cp ../tls/ca-cert.pem msp/tlscacerts/ca-cert.pem
4.2 生成創世區塊和通道配置信息
可以了,所有的前期工作都已經完成,接下來就是手動啟動網絡了,第一步,生成創世區塊和通道配置信息:
cd $GOPATH/src/github.com/caDemo
export FABRIC_CFG_PATH=$PWD
#生成創世區塊
configtxgen -profile TwoOrgsOrdererGenesis -outputBlock $GOPATH/src/github.com/caDemo/genesis.block
#生成通道配置信息
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx $GOPATH/src/github.com/caDemo/channel.tx -channelID mychannel
4.3 啟動Orderer節點
orderer
容器配置文件:
orderer-org0:
container_name: orderer-org0
image: hyperledger/fabric-orderer
environment:
- ORDERER_HOME=/tmp/hyperledger/orderer
- ORDERER_HOST=orderer-org0
- ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
- ORDERER_GENERAL_GENESISMETHOD=file
- ORDERER_GENERAL_GENESISFILE=/tmp/hyperledger/genesis.block
- ORDERER_GENERAL_LOCALMSPID=org0MSP
- ORDERER_GENERAL_LOCALMSPDIR=/tmp/hyperledger/org0/orderer/msp
- ORDERER_GENERAL_TLS_ENABLED=true
- ORDERER_GENERAL_TLS_CERTIFICATE=/tmp/hyperledger/org0/orderer/tls-msp/signcerts/cert.pem
- ORDERER_GENERAL_TLS_PRIVATEKEY=/tmp/hyperledger/org0/orderer/tls-msp/keystore/key.pem
- ORDERER_GENERAL_TLS_ROOTCAS=[/tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem]
- ORDERER_GENERAL_LOGLEVEL=debug
- ORDERER_DEBUG_BROADCASTTRACEDIR=data/logs
volumes:
- $GOPATH/src/github.com/caDemo/org0/orderer:/tmp/hyperledger/org0/orderer/
- $GOPATH/src/github.com/caDemo:/tmp/hyperledger/
networks:
- fabric-ca
關鍵部分到了,只要這一步沒有出現錯誤,整個網絡就啟動成功了。
docker-compose -f docker-compose.yaml up orderer-org0
4.4 啟動組織一的cli容器
cli
容器內容,我們需要這個容器對組織1進行鏈碼的交互:
cli-org1:
container_name: cli-org1
image: hyperledger/fabric-tools
tty: true
stdin_open: true
environment:
- SYS_CHANNEL=testchainid
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- FABRIC_LOGGING_SPEC=DEBUG
- CORE_PEER_ID=cli-org1
- CORE_PEER_ADDRESS=peer1-org1:7051
- CORE_PEER_LOCALMSPID=org1MSP
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
- CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/signcerts/cert.pem
- CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org1/peer1/tls-msp/keystore/key.pem
- CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/peer1/msp
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org1
command: /bin/bash
volumes:
- $GOPATH/src/github.com/caDemo/org1/peer1:/tmp/hyperledger/org1/peer1
- $GOPATH/src/github.com/caDemo/org1/peer1/assets/chaincode:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode
- $GOPATH/src/github.com/caDemo/org1/adminuser:/tmp/hyperledger/org1/adminuser
- $GOPATH/src/github.com/caDemo:/tmp/hyperledger/
networks:
- fabric-ca
depends_on:
- peer1-org1
啟動該容器:
docker-compose -f docker-compose.yaml up cli-org1
4.5 啟動組織二的cli容器
cli
容器內容,我們需要這個容器對組織2進行鏈碼的交互:
cli-org2:
container_name: cli-org2
image: hyperledger/fabric-tools
tty: true
stdin_open: true
environment:
- SYS_CHANNEL=testchainid
- GOPATH=/opt/gopath
- CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
- FABRIC_LOGGING_SPEC=DEBUG
- CORE_PEER_ID=cli-org2
- CORE_PEER_ADDRESS=peer1-org2:9051
- CORE_PEER_LOCALMSPID=org2MSP
- CORE_PEER_TLS_ENABLED=true
- CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org2/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
- CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org2/peer1/tls-msp/signcerts/cert.pem
- CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org2/peer1/tls-msp/keystore/key.pem
- CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/peer1/msp
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org2
command: /bin/bash
volumes:
- $GOPATH/src/github.com/caDemo/org2/peer1:/tmp/hyperledger/org2/peer1
- $GOPATH/src/github.com/caDemo/org2/peer1/assets/chaincode:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode
- $GOPATH/src/github.com/caDemo/org2/adminuser:/tmp/hyperledger/org2/adminuser
- $GOPATH/src/github.com/caDemo:/tmp/hyperledger/
networks:
- fabric-ca
depends_on:
- peer1-org2
啟動該容器:
docker-compose -f docker-compose.yaml up cli-org2
5.網絡測試
所有工作准備完成,接下來讓我們測試整個網絡能不能正常運行吧:
5.1 創建與加入通道
以組織1為例:
- 首先進入
cli
容器:
docker exec -it cli bash
#配置環境變量
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/adminuser/msp
- 創建通道
peer channel create -c mychannel -f /tmp/hyperledger/channel.tx -o orderer-org0:7050 --outputBlock /tmp/hyperledger/mychannel.block --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
- 將
peer1-org1
加入通道:
export CORE_PEER_ADDRESS=peer1-org1:7051
peer channel join -b /tmp/hyperledger/mychannel.block
- 將
peer2-org1
加入通道:
export CORE_PEER_ADDRESS=peer2-org1:8051
peer channel join -b /tmp/hyperledger/mychannel.block
組織二步驟是相同的,唯一不同的就是不需要創建通道了,所以就不再說明了。
5.2 安裝和實例化鏈碼
以組織1為例:
- 首先進入
cli
容器:
docker exec -it cli bash
#配置環境變量
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/adminuser/msp
export CORE_PEER_ADDRESS=peer1-org1:7051
- 安裝鏈碼
記得提前將鏈碼放到$GOPATH/src/github.com/caDemo/org1/peer1/assets/chaincode
路徑下。,本文使用的是fabric-samples/chaincode/chaincode_example02
官方示例鏈碼。
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric-samples/chaincode/chaincode_example02/go/
- 實例化鏈碼
peer chaincode instantiate -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -o orderer-org0:7050 --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
- 這一步在高版本的Fabric網絡是會出錯的,因為少了一個文件
config.yaml
:
NodeOUs:
Enable: true
ClientOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem #這里需要修改
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem #這里需要修改
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem #這里需要修改
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/ca.example.com-cert.pem #這里需要修改
OrganizationalUnitIdentifier: orderer
因為高版本的Fabric把節點類型區分開了,所以需要我們手動配置。
將該文件復制到$GOPATH/src/github.com/caDemo/org1/adminuser/msp
文件夾內,同時修改上面指定的位置的文件名(與對應文件夾內的文件名對應就好了)。
- 實例化部分出錯的可能性是最高的,很多都是因為網絡模式指定錯誤導致鏈碼容器啟動失敗,解決方案:
#終端執行命令
docker network ls
找到以fabric-ca
為后綴的一條如cademo_fabric-ca
,修改之前的所有peer
節點容器配置文件的環境變量:
- CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=cademo_fabric-ca
修改完成重啟節點容器,再次執行以上的命令(需要重新配置環境變量,加入通道這兩個操作)。
終於,實例化成功了。
5.3 調用和查詢鏈碼
最后測試一下鏈碼功能能不能正常使用了:
- 還是組織一的
cli
容器:
docker exec -it cli bash
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/adminuser/msp
export CORE_PEER_ADDRESS=peer1-org1:7051
- 執行查詢功能:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
命令行應該打印出:
100
- 執行調用功能:
peer chaincode invoke -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}' --tls --cafile /tmp/hyperledger/org2/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
- 再次查詢:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
命令行應該打印出:
90
至於其他節點操作方法也是一樣的,就不再操作了。
到此為止,從零開始的手動生成證書一直到成功搭建Fabric網絡全部步驟已經完成!!接下來還有更新錨節點等等就不再演示了,請各位讀者自行操作。整個步驟是不容易的,而且BUG百出,不過成功搭建完成確實漲了不少知識。
碼字不易,還望各位看官支持一下:
