Hyperledger fabric 賬號 CA篇 (七)
1、Fabric賬號
1.1、含義
根據PKI規范生成的一組證書和密鑰文件
1.2、作用
- 保證記錄在區塊鏈的數據具有不可逆,防篡改
- Fabric中每條組織交易都會加上發起者的標簽(簽名證書),同時用發起人的私鑰進行加密
- 如果交易需要其他組織的節點提供背書功能,那么背書節點也會在交易中加入自己的簽名
1.3、適用場景
- 啟動order節點
- 啟動peer節點
- 創建通道
2、證書文件
2.1、組織證書
liuhui@liuhui-ThinkPad-T550:~/fabricsample/crypto-config/peerOrganizations/org1.example.com$ tree msp
msp
├── admincerts
├── cacerts
│ └── ca.org1.example.com-cert.pem
├── config.yaml
└── tlscacerts
└── tlsca.org1.example.com-cert.pem
3 directories, 3 files
2.2、節點證書
liuhui@liuhui-ThinkPad-T550:~/fabricsample/crypto-config/peerOrganizations/org1.example.com/peers$ tree peer0.org1.example.com/
peer0.org1.example.com/
├── msp
│ ├── admincerts
│ ├── cacerts
│ │ └── ca.org1.example.com-cert.pem
│ ├── config.yaml
│ ├── keystore
│ │ └── cf8d9658215ef005bc979d4ef3402dfafdbee7762b131eaaa33031c97d03ae66_sk
│ ├── signcerts
│ │ └── peer0.org1.example.com-cert.pem
│ └── tlscacerts
│ └── tlsca.org1.example.com-cert.pem
└── tls
├── ca.crt
├── server.crt
└── server.key
7 directories, 8 files
msp文件夾中內容主要用於存放簽名用的證書文件和加密用的私鑰文件
- admincerts:管理員證書
- cacerts:根CA服務器的證書
- keystore:節點或者賬號的私鑰
- signcerts:符合X.509的節點或者用戶證書文件
- tlscacerts:TLS根CA的證書
tls文件夾:存放加密通信相關的證書文件
2.3、用戶證書
liuhui@liuhui-ThinkPad-T550:~/fabricsample/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com$ tree msp
msp
├── admincerts
├── cacerts
│ └── ca.org1.example.com-cert.pem
├── config.yaml
├── keystore
│ └── d6f96d6351b1504e31b7612919fb70f2c5a889f8cda4627c4bb5f3c542f3026d_sk
├── signcerts
│ └── User1@org1.example.com-cert.pem
└── tlscacerts
└── tlsca.org1.example.com-cert.pem
5 directories, 5 files
3、Fabric-CA
3.1、含義及架構解析
fabric-ca項目是專門為了解決fabric賬號問題而發起的一個開源項目,它解決了fabric賬號生成的問題,fabric-ca項目由fabric-server和fabric-client兩個模塊組成,其中fabric-server在fabric中占有非常重要的作用,我們使用cryptogen命令可以同配置文件生成一些賬號信息,但是如果有動態添加賬號的需求,就無法滿足,所以引入了fabric-ca

fabric-CA提供了兩種訪問方式調用server服務
- 通過fabric-client調用
- 通過SDK調用(node.js,java,go)
通常情況下,一個組織會對應一個fabric-server服務器,根CA可以對子CA進行授權,便可以在子CA中注冊賬號
當fabric中多個組織時,要在每個組織中部署一個fabric-ca服務器,給當前組織注冊新用戶
3.2、安裝Fabric CA
-
安裝libtool 與libltdl-dev依賴包
$ sudo apt update $ sudo apt install libtool libltdl-dev
-
安裝服務端與客戶端(兩種方式,我是第二種方式安裝成功的,第一種下載失敗)
(1)直接下載二進制可執行文件
$ go get -u github.com/hyperledger/fabric-ca/cmd/...
命令下載后會在
$GOPATH/bin
目錄下產生兩個可執行文件- fabric-ca-client
- fabric-ca-server
設置環境變量,便於在任何路徑下可以直接使用這兩個命令
export PATH=$PATH:$GOPATH/bin
(2)從源碼編譯安裝
從
github.com
下載fabric-ca
源碼到hyperledger
目錄下cd $GOPATH/src/github.com/hyperledger/ git clone https://github.com/hyperledger/fabric-ca.git cd fabric-ca #進行源碼編譯 make fabric-ca-server make fabric-ca-client
當前文件下會編譯出一個
bin
文件夾,最后一步將該文件夾添加到環境變量,保證文件夾下命令可以在任何路徑下執行。
3.3、啟動Fabric-CA
在docker-compose配置文件中添加CA服務,然后運行Shell命令啟動
在docker-compose啟動時使用的配置文件docker-compose.yaml中添加如下配置項
注意:有幾個組織加幾個CA
#配置項中的證書文件和私鑰文件都需要去相應的組織中尋找進行修改
services:
################################添加的內容#####################################
ca.example.com: # fabric-ca的服務器名,可修改
image: hyperledger/fabric-ca #鏡像文件
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server #fabric-ca容器中的home目錄
- FABRIC_CA_SERVER_CA_NAME=ca.example.com #fabric-ca服務器的名字,與前面一致
#fabric-ca服務器證書文件,確定當前fabric-ca屬於哪個組織
- FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
#fabric-ca服務器的私鑰文件
- FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/4239aa0dcd76daeeb8ba0cda701851d14504d31aad1b2ddddbac6a57365e497c_sk
ports: #綁定的端口
- "7054:7054"
#啟動fabric-ca-server服務命令
#參數:admin:adminpw(可修改)
#---admin:fabric-ca-server的登陸用戶名
#---adminpw: fabric-ca-server的登陸密碼
command: sh -c 'fabric-ca-server start -b admin:adminpw'
volumes:
- ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: ca.example.com #容器名
networks:
- basic
運行docker-compose容器
liuhui@liuhui-ThinkPad-T550:~/fabricsample$ docker-compose -f docker-compose-cli.yaml ps
Name Command State Ports
--------------------------------------------------------------------------------
ca.example.com sh -c fabric-ca-server Up 0.0.0.0:7054->7054/tcp sta ...
cli /bin/bash Up
orderer.example.com orderer Up 0.0.0.0:7050->7050/tcp
peer0.org1.example.com peer node start Up 0.0.0.0:7051->7051/tcp
peer0.org2.example.com peer node start Up 0.0.0.0:9051->9051/tcp
peer1.org1.example.com peer node start Up 0.0.0.0:8051->8051/tcp
peer1.org2.example.com peer node start Up 0.0.0.0:10051->10051/tcp
3.4、Fabric CA 命令交互
fabric-ca-server已經啟動,最簡單的方式是使用fabric-ca-client客戶端工具進行交互
fabric-ca-client命令與服務端進行交互,包括5個子命令
- enroll :注冊獲取ECert
- register : 登記用戶
- getcainfo : 獲取CA服務的證書鏈
- reenroll : 重新注冊
- revoke: 撤銷簽發的證書身份
- version:Hyperledger Fabric CA客戶端版本信息
3.4.1、注冊初始化管理員用戶
在fabric CA服務端啟動時有一個管理員用戶,需要先注冊初始化的管理員用戶,獲取注冊證書以后才能進行后續的操作
- 設置fabric-ca-client所在路徑
- 設置Hyperledger Fabric CA 客戶端主目錄
- 調用在7054端口運行的Fabric CA服務器來注冊ID為admin且密碼為adminpw的標識(在之前docker-compose.yaml配置文件已經指定)
export PATH=$PATH:$GOPATH/bin
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client enroll -u http://admin:pass@localhost:7054
如果名稱和密碼不匹配,注冊會出現一下錯誤
Error:Response from server: Error Code: 20 - Authorization failure
執行成功后生成的文件結構如下:
liuhui@liuhui-ThinkPad-T550:~$ tree fabric-ca/clients/
fabric-ca/clients/
├── admin
│ ├── fabric-ca-client-config.yaml
│ └── msp
│ ├── cacerts
│ │ └── localhost-7054.pem
│ ├── IssuerPublicKey
│ ├── IssuerRevocationPublicKey
│ ├── keystore
│ │ ├── 813d2ffbd9a55c4ead6b5a93207412fb283f04986b3e927df49106203060f5fc_sk
│ │ └── da9b3f07279f2ca03e1002ccb10b1cf3bed485ed26f30b37491b9072a07974d4_sk
│ ├── signcerts
│ │ └── cert.pem
│ └── user
3.4.2、登記一個新用戶
只有已經注冊的用戶才可以發起登記(register)請求,發起登記請求的用戶稱為登記員,登記新用戶的時候還需要有相應的權限,Fabric CA服務端在接收到登記請求時需要進行如下幾個方面的檢查
- 登記員需要有登記用戶的登記權限,登記員可以登記的用戶類型記錄在
hf.Registrar.Roles
屬性中,如果屬性保存的內容為:peer,app,user。則登記員可以登記peer,app,user類型的用戶,但不能登記orderer類型的用戶。- 登記員只能登記自己歸屬范圍內的用戶,比如登記員歸屬為a.b,可以登記歸屬a.b.c的用戶,不能登記a.c的用戶。如果不指定登記用戶的歸屬,則默認和登記員的歸屬一樣
- 登記的用戶屬性需要滿足以下條件
- 登記的用戶屬性需要包含在登記員的用戶屬性“
hf.Registar.Attributes
”中,目前只支持“*“通配符,比如a.b.*表示所有a.b開頭的屬性名稱- 如果登記的用戶也有
hf.Registar.Attributes
屬性,需要其是登記員用戶屬性hf.Registar.Attributes
的子集。比如登記員屬性a.b.*,則登記用戶可以為a.b.c,但不可以為a.b
接下來使用admin
的身份注冊一個身份:
id
為admin2
affiliation
為org1.department1
- 屬性名字為
hf.Revoker
,對應的值為true
- 屬性名字為
admin
,對應的值為true
其中對於屬性admin=true
,后綴為ecert
表示這條admin屬性將會添加到用戶注冊證書中,實現訪問控制。
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register --id.name admin2 --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,admin=true:ecert'
命令運行后會輸出該用戶密碼
...
Password: LlkagjaljjgEWj
如果想使用指定的密碼,則需要在命令中添加選項 --id.secret password
即可
需要注意:登記時可以將多個屬性指定為 -id.attrs標志的一部分,每個屬性必須以逗號分隔。對於包含逗號的屬性值,必須將該屬性封裝在雙引號中。
3.4.3、登記注冊節點
登記peer或orderer節點的操作與登記用戶身份類似,可以用過-M指定本地MSP的根路徑以在其下存放證書文件。
- 登記一個名為peer1的節點,密碼為peer1pw
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register \
--id.name peer1 \
--id.type peer \
--id.affiliation org1.department1 \
--id.secret peer1pw
- 注冊節點
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
fabric-ca-client enroll \
-u http://peer1:peer1pw@localhost:7054 \
-M $FABRIC_CA_CLIENT_HOME/msp
命令成功后會在指定MSP文件下生成私鑰和證書