1. 程式人生 > >fabric CA

fabric CA

Fabric CA為Hyperledger Fabric行使證書機構的功能。

Fabric CA提供以下功能:

  1. 身份註冊,或者將連線到LDAP作為使用者註冊;
  2. 頒發登入證書(ECerts);
  3. 頒發交易證書(TCerts),保證鏈上交易的匿名性與不可連線性;
  4. 證書續期與撤銷

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 。優先順序如下:

  1. 命令列引數
  2. 環境變數
  3. 配置檔案

配置優先順序由高到低依次為命令列引數 > 環境變數 > 配置檔案

配置檔案的修改可以被環境變數或者命令列引數覆蓋

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