Hyperledger fabric 賬號 CA篇 (七)
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/[email protected]$ tree msp msp ├── admincerts ├── cacerts │ └── ca.org1.example.com-cert.pem ├── config.yaml ├── keystore │ └── d6f96d6351b1504e31b7612919fb70f2c5a889f8cda4627c4bb5f3c542f3026d_sk ├── signcerts │ └── [email protected] └── 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
![](/home/liuhui/文件/hyperledge Fabric/fabric-ca.png)
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檔案下生成私鑰和證書