fabric CA
Fabric CA為Hyperledger Fabric行使證書機構的功能。
Fabric CA提供以下功能:
- 身份註冊,或者將連線到LDAP作為使用者註冊;
- 頒發登入證書(ECerts);
- 頒發交易證書(TCerts),保證鏈上交易的匿名性與不可連線性;
- 證書續期與撤銷
Fabric CA 包含一個服務端元件和一個客戶端元件
下圖說明了 Fabric CA 服務端如何在 Hyperledger Fabric 架構中發揮作用
fabric ca原始碼 https://github.com/hyperledger/fabric-ca
使用文件 https://hyperledger-fabric-ca.readthedocs.io/en/latest/
需要安裝兩個包
centos yum install libtool libtool-ltdl-devel
ubuntu apt install libtool libltdl-dev
Fabric CA 提供3種方式來配置 fabric-ca-server 和 fabric-ca-client 。優先順序如下:
- 命令列引數
- 環境變數
- 配置檔案
配置優先順序由高到低依次為命令列引數 > 環境變數 > 配置檔案
配置檔案的修改可以被環境變數或者命令列引數覆蓋
fabric-ca-server 和 fabirc-ca-client 的配置檔案裡的所有屬性都支援相對路徑和絕對路徑。相對路徑是相對於配置目錄,即配置檔案所在的目錄
實驗步驟:
export FABRIC_CA_SERVER_HOME=/opt/gopath/src/github.com/hyperledger/fabric-ca-server
export FABRIC_CA_CLIENT_HOME=/opt/gopath/src/github.com/hyperledger/fabric-ca-client
初始化fabric-ca服務端
fabric-ca-server init -b admin:adminpw
-b 選項指定了引導身份的使用者名稱和密碼
[root@localhost hyperledger]# ls fabric-ca-server/
ca-cert.pem fabric-ca-server-config.yaml fabric-ca-server.db msp
ca-cert.pem是CA中心的根證書,用自己的私鑰自簽名,證書包含自己的公鑰,用於驗證其它簽名證書的有效性
fabric-ca-server-config.yaml為CA服務端配置檔案
fabric-ca-server.db是儲存註冊使用者和證書的資料庫
msp/keystore裡存放的是CA中心的私鑰,用於生成根證書和其它證書
啟動fabric服務端
fabric-ca-server start -b admin:adminpw
登陸剛才引導註冊的身份,取得登陸使用者CA證書
fabric-ca-client enroll -u http://admin:adminpw@localhost:7054
[root@localhost hyperledger]# ls fabric-ca-client/
fabric-ca-client-config.yaml msp
fabric-ca-client-config.yaml是CA客戶端的配置檔案
msp/cacerts存放的是根證書(與CA服務端根證書相同)
msp/keystore存放的是登陸使用者的私鑰
msp/signcerts存放的是登陸使用者的身份證書,證書由CA服務端私鑰簽名,證書包含了登陸使用者的身份資訊和公鑰
註冊一個新的身份證
只有已經登入了的身份才能發起註冊的請求,而且必須有相應的許可權來註冊想要註冊的身份型別
fabric-ca-client register --id.name zhaolong--id.type user --id.affiliation org1.department1 --id.attrs hf.Revoker=true
會顯示密碼:
Password: qNRdsGhrPnYE
密碼會被打印出來,登入這個新註冊的身份的時候,需要用到這個密碼。這允許一個管理員註冊身份,然後把這個身份的ID和密碼給別人來登陸。
註冊一個節點身份,在這裡我們選擇指明自己的密碼,而不是由伺服器生成
fabric-ca-client register --id.name peer1 --id.type peer --id.affiliation org1.department1 --id.secret peer1pw
登陸一個節點
export FABRIC_CA_CLIENT_HOME=/opt/gopath/src/github.com/hyperledger/fabric-user/peer1
fabric-ca-client enroll -u http://peer1:peer1pw@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/msp
-M選項允許你指定登陸節點CA證書儲存在哪
從另一個Fabric CA伺服器獲得CA證書鏈
下面的命令會在本地啟動第二個Fabric CA伺服器,監聽7055埠,命名為“CA2“。這代表兩個由不同成員管理的分開的信任中心。
export FABRIC_CA_SERVER_HOME=/opt/gopath/src/github.com/hyperledger/fabric-ca-server2
fabric-ca-server start -b admin:ca2pw -p 7055 -n CA2
下面的命令會把CA2的證書鏈安裝進peer1的MSP2目錄,也就是取得CA2的根證書
export FABRIC_CA_CLIENT_HOME=/opt/gopath/src/github.com/hyperledger/fabric-user/peer1
fabric-ca-client getcacert -u http://localhost:7055 -M $FABRIC_CA_CLIENT_HOME/msp2
重新登陸一個身份
假設你的登陸證書快過期了,你可以重新登陸來替換你的登陸證書(ECert)
export FABRIC_CA_CLIENT_HOME=/opt/gopath/src/github.com/hyperledger/fabric-user/peer1
fabric-ca-client reenroll
登陸超時時間由expiry欄位指定
撤銷一個證書或身份
身份和證書都能被撤銷。撤銷一個身份會撤銷該身份擁有的所有證書,該身份也不能再獲得新的證書。撤銷一個證書會使該證書失效。
為了撤銷一個證書或身份,發起者必須有hf.Revoker屬性。發起者只能撤銷與自己的affiliation相同的證書或身份,或者發起者的affiliation是被撤銷者的affiliation的字首
撤銷peer1的身份
export FABRIC_CA_CLIENT_HOME=/opt/gopath/src/github.com/hyperledger/fabric-ca-client
fabric-ca-client revoke -e peer1
一個身份可以撤銷自己的登陸證書(ECert),需要指定ECert的AKI和序列號:
fabric-ca-client revoke -a xxx -s yyy -r <reason>
可以通過openssl命令來獲取一個證書的AKI和序列號:
serial=$(openssl x509 -in userecert.pem -serial -noout | cut -d "=" -f 2)
aki=$(openssl x509 -in userecert.pem -text | awk '/keyid/ {gsub(/ *keyid:|:/,"",$1);print tolower($0)}')
fabric-ca-client revoke -s $serial -a $aki -r affiliationchange