Fabric-Ca使用


Fabric—Ca的概念不再解釋了,這里只說明使用方法:

前置條件

  • Go語言1.10+版本
  • GOPATH環境變量正確設置
  • 已安裝libtoollibtdhl-dev

Ubuntu系統

通過以下命令安裝libtoollibtdhl-dev包:

sudo apt install libtool libltdl-dev

MacOs 系統

Mac系統通過以下命令安裝:

brew install libtool

Fabric-Ca安裝

可以通過以下兩種途徑進行安裝:

  1. 直接下載二進制文件:
go get -u github.com/hyperledger/fabric-ca/cmd/...

如果使用這種方式安裝,安裝成功的話直接在命令行輸入(前提是GOPATH正確配置):

fabric-ca-server version

即可打印出安裝的Ca版本。
2. 從源碼編譯安裝:
首先在系統中建立以下路徑:

mkdir -p $GOPATH/src/github.com/hyperledger/
cd $GOPATH/src/github.com/hyperledger/

從Github上面將Fabric-Ca倉庫克隆到本地:

git clone https://github.com/hyperledger/fabric-ca.git
cd fabric-ca

進行源碼編譯:

make fabric-ca-server
make fabric-ca-client

如果沒有報錯的話,當前文件下會編譯出一個bin文件夾,最后一步將該文件夾添加到環境變量,安裝完成!

編譯Ca的Docker鏡像

直接在fabric-ca文件夾內執行以下命令:

make docker

Fabric-Ca服務器簡單使用


設置Fabric Ca服務器的Home文件夾

啟動Fabric Ca 服務器的第一步是需要對Fabric Ca服務器進行初始化操作,初始化操作將會生成一些默認的配置文件,所以我們首先需要指定一個文件夾作為服務器的主文件夾用來放生成的配置文件。
可以通過以下幾種方式設置Fabric-Ca服務器的主文件夾,優先級由高到低排序:

  1. 通過命令行設置參數--home設置。
  2. 如果設置了FABRIC_CA_SERVER_HOME環境變量,則使用該環境變量作為主文件夾。
  3. 如果設置了FABRIC_CA_HOME環境變量,則使用該環境變量作為主文件夾。
  4. 如果設置了CA_CFG_PATH環境變量,則使用該環境變量作為主文件夾。
  5. 如果以上方法都沒有設置,則將當前工作目錄作為主文件夾。

官方建議是通過設置FABRIC_CA_HOME$HOME/fabric-ca/server作為服務器的主文件夾。

初始化服務器

上一步驟完成后,就可以對Fabric Ca進行初始化了,執行以下命令:

fabric-ca-server init -b admin:adminpw

通過-b參數指定管理員的賬號和密碼對服務器進行初始化。將會生成一個自簽名的證書。

  • admin:相當於管理員賬號
  • adminpw:相當於管理員密碼

admin:adminpw可以自行設置。
或者服務器的初始化也可以通過-u參數指定服務器的上一級服務器,也就是父服務器。格式為:-u <parent-fabric-ca-server-URL,其中這里的URL必須使用<協議>://<enrollmentId>:<secret>@<host>:<port>的格式。
初始化之后將會生成幾個文件:

IssuerPublicKey      #與零知識證明相關文件,暫不解釋
IssuerRevocationPublicKey #與零知識證明相關文件,暫不解釋
ca-cert.pem             #CA服務器的根證書文件,只有持有該證書,用戶才可以進行證書的頒發
fabric-ca-server-config.yaml   #默認配置文件,對Ca服務器進行配置時可以用到
fabric-ca-server.db  #Ca服務器數據庫,存儲注冊的用戶,組織,證書等信息。可以通過sqlite3 命令進去查看
msp/

啟動服務器

初始化之后可以直接啟動服務器:

fabric-ca-server start -b <admin>:<adminpw>

服務器將會監聽在7054端口。如果需要服務器監聽在https上而不是http上,需要將tls.enabled設置為true

啟動完之后,即可以通過fabric-ca-client工具或者是SDK對Ca服務器進行操作了。

Fabric Ca 客戶端

這一部分說明命令行工具fabric-ca-client的簡單使用。

設置Fabric Ca客戶端的Home文件夾

與服務器相同,客戶端也具有自己的主文件夾,用來保存客戶端的證書秘鑰等等。
可以通過以下幾種方式設置Fabric-Ca客戶端的主文件夾,優先級由高到低排序:

  1. 通過命令行設置參數--home設置。
  2. 如果設置了FABRIC_CA_CLIENT_HOME環境變量,則使用該環境變量作為主文件夾。
  3. 如果設置了FABRIC_CA_HOME環境變量,則使用該環境變量作為主文件夾。
  4. 如果設置了CA_CFG_PATH環境變量,則使用該環境變量作為主文件夾。
  5. 如果以上方法都沒有設置,則$HOME/.fabric-ca-client將作為主文件夾。

官方例子:export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin

用戶登陸

設置完之后,我們使用命令行工具登陸管理員用戶:

fabric-ca-client enroll -u http://admin:adminpw@localhost:7054

admin目錄下會產生以下文件:

.
├── fabric-ca-client-config.yaml
└── msp
    ├── IssuerPublicKey
    ├── IssuerRevocationPublicKey
    ├── cacerts
    │   └── localhost-7054.pem     #CA服務器的根證書,只不過換了一個名字
    ├── keystore
    │   └── 7ec84cbc25c20600ba98bf2bafb9c695ad57e392a57fb9f33b51fc493601a432_sk  #當前用戶的秘鑰信息
    ├── signcerts
    │   └── cert.pem   #當前用戶的證書
    └── user

注冊一個身份

通過Fabric-CA注冊新的身份時,將由Fabric-CA服務器進行三個部分的權限檢查確定當前用戶是否具有權限進行身份的注冊。

  1. 注冊者必須含有hf.Registrar.Roles屬性,並且需要注冊的身份類型必須在該屬性對應的值的列表中存在。比如注冊者的hf.Registrar.Roles屬性中對應的值只有一個peer,那么注冊者使能注冊類型為peer的身份,而不能注冊client,admin,orderer.如果注冊者的hf.Registrar.Roles屬性對應的值為*,則說明可以注冊任何類型的身份。
  2. 簡單說就是上下級關系,比如注冊者所處的部門為a.b,那么他只能注冊處於a.b以及a.b.*部門的身份,而不能注冊處於a.c部門的身份。如果需要注冊一個最上級的部門的身份,那么需要將需要將需要注冊的身份的hf.affiliation指定為.,並且注冊者所處的部門也需要是最上級的部門。如果在注冊身份時沒有指定所屬的部門,則默認被注冊的身份所處的部門與注冊者部門相同。
  3. 如果注冊者滿足以下條件則可以注冊帶有屬性的身份:
    • 對於Fabric CA中的保留屬性(前綴以hf開頭的):只有注冊者具有這個屬性並且是hf.Registrar.Attributes屬性中的值得一部分。也就是說如果需要注冊一個帶有hf.a屬性的身份,那么注冊者自己也需要有這個屬性,並且在注冊者的hf.Registrar.Attributes屬性對應的值中需要包含hf.a這個屬性。並且hf.a這個屬性的值是一個列表,那么被注冊的身份具有的hf.a屬性只能等於或者等於列表中的一個子集。另外,如果hf.a這個屬性的值對應的是一個布爾值,那么需要注冊者hf.a屬性的值為true
    • 對於注冊者自定義的屬性(不是Fabric Ca中的保留屬性):注冊者hf.Registrar.Attributes對應的值需要包括這個屬性,或者是已經注冊過的模式。唯一支持的模式是以*結尾的字符串。比如注冊者hf.Registar.Attributes對應的值為a.b.*,那么他可以注冊的屬性需要以a.b.開頭。如果注冊者hf.Registar.Attributes對應的值為orgAdmin,那么注冊者只可以對一個身份進行添加或者刪除orgAdmin屬性.
    • 對於hr.Registrar.Attributes屬性:一個額外的檢查是該屬性對應的值需要等於注冊者具有的該屬性對應的值,或者是注冊者具有的該屬性對應的值的子集。

接下來使用admin的身份注冊一個身份:

  • enrollment idadmin2
  • 部門為org1.department1
  • 屬性名字為hf.Revoker,對應的值為true
  • 屬性名字為admin,對應的值為true
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'

其中對於屬性admin=true,后綴為ecert表示這條屬性將會添加到證書中,可以用來進行做訪問控制的決定。

對於多個屬性,可以使用--id.attrs參數標記,並使用單引號括起來,每個屬性使用逗號分隔開:

fabric-ca-client register -d \
    --id.name admin2 \
    --id.affiliation org1.department1 \
    --id.attrs '"hf.Registrar.Roles=peer,client",hf.Revoker=true'

或者是:

fabric-ca-client register -d \
    --id.name admin2  \
    --id.affiliation org1.department1 \
    --id.attrs '"hf.Registrar.Roles=peer,client"' \
    --id.attrs hf.Revoker=true

或者是通過客戶端配置文件fabric-ca-client-config.yaml

id:
  name:
  type: client
  affiliation: org1.department1
  maxenrollments: -1
  attributes:
    - name: hf.Revoker
      value: true
    - name: anotherAttrName
      value: anotherAttrValue

接下來的命令是通過以上的配置文件注冊一個身份:

  • enrollment idadmin3
  • 身份類型為client
  • 部門為org1.department1
  • 屬性名字為hf.Revoker,對應的值為true
  • 屬性名字為anotherAttrName,對應的值為anotherAttrValue

設置maxenrollments為0或者是不設置將導致該身份可以使用CA的最大enrollment次數。並且一個身份的maxenrollments不能超過CAenrollments最大值。例如,如果CAenrollment最大值為5,則任何新的身份必須含有一個小於等於5的值。並且也不能設置為-1(-1表示無限制).

接下來注冊一個peer類型的身份。在這里我們選擇自定義的密碼而不是由服務器自動生成:

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

注意,部門信息區分大小寫,但服務器配置文件中指定的非葉子部門關系始終以小寫形式存儲。 例如,如果服務器配置文件的部門關系部分如下所示:

affiliations:
  BU1:
    Department1:
      - Team1
  BU2:
    - Department2
    - Department3

BU1,Department1,BU2使用小寫進行存儲。這是因為Fabric CA使用Viper讀取配置。Viper對於大小寫不敏感,如果需要注冊一個身份部門為Team1,則需要通過--id.affiliation參數這樣配置:bu1.department1.Team1

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register \
    --id.name client1 \
    --id.type client \
    --id.affiliation bu1.department1.Team1

登錄一個peer身份的用戶

之前已經成功注冊了一個peer身份的用戶,可以通過指定idsecret進行登錄,與之前不同的是需要通過-M參數指定Hyperledger Fabric MSP(成員關系服務提供者)文件夾結構。

接下來的命令將會登錄peer1,確保使用-M參數指定了peer的MSP文件夾路徑,該路徑也是peercore.yaml文件內mspConfigPath參數的設置值。或者也可以通過環境變量FABRIC_CA_CLIENT_HOME指定peer的主目錄。

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

登錄一個orderer也是相同的,除了MSP文件夾是在ordererorderer.yaml文件中通過參數LocalMSPDir進行設置。

fabric-ca-server頒發的所有注冊證書均具有以下組織單位(或簡稱為“ OU”):

  1. OU層次結構的根等於身份類型。
  2. OU被添加到身份部門關系的每個組成部分。

例如,如果一個身份類型為peer,部門為department.team1,則身份的OU分層(從根部開始):OU=team1,OU=department1,OU=peer.

獲取身份混合器證書

...

獲取身份混合器證書撤銷信息

重新登錄一個身份

假如你的登錄證書過期了或者被惡意操作,需要通過以下命令重新創建一個登錄證書:

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
fabric-ca-client reenroll

撤銷一個證書或者身份

身份或者證書是可以被撤銷的。撤銷一個身份將會撤銷所有屬於這個身份的證書同時也會阻止該身份去獲取新的證書。撤銷一個證書只會使單個證書無效。

為了撤銷一個證書或者是身份。撤銷者必須含有hf.Revokerhf.Registrar.Roles兩個屬性。撤銷一個身份只可以撤銷從屬於自己下級或者相同級別部門的證書或者是身份。進一步,撤銷者只能撤銷在撤銷者hf.Registrar.Roles屬性列表中存在的身份類型的身份。

例如,部門為orgs.org1並且hf.Registrar.Roles=peer,client的撤銷者可以撤銷從屬於orgs.org1部門或者是orgs.org1.department1並且身份類型為peer或者是client的身份。不能撤銷從屬於orgs.org2部門或者是其他類型的身份。

下面的命令將會使一個身份與該身份下的所有證書失效,該身份未來對fabric CA服務器的所有請求將會被拒絕。

fabric-ca-client revoke -e <enrollment_id> -r <reason>

下面是-r參數支持的具體的原因:

  1. unspecified
  2. keycompromise
  3. cacompromise
  4. affiliationchange
  5. superseded
  6. cessationofoperation
  7. certificatehold
  8. removefromcrl
  9. privilegewithdrawn
  10. aacompromise

例如,引導啟動的admin屬於部門的最上級可以撤銷peer1的身份信息:

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client revoke -e peer1

屬於一個身份的登錄證書可以通過具體的AKI(權限密鑰標識符)和序列號進行撤銷:

fabric-ca-client revoke -a xxx -s yyy -r <reason>

例如,可以通過使用openssl命令獲取一個證書的AKI和序列號並通過revoke命令撤銷證書:

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

--gencrl參數可以用來生成CRL(證書撤銷列表),CRL包含所有被撤銷的證書。例如,以下命令可以撤銷peer1的身份。生成一個CRL並存儲到<msp 文件夾>/crls/crl.pem文件。

fabric-ca-client revoke -e peer1 --gencrl

CRL可以使用gencrl命令生成,參考生成CRL部分獲取關於gencrl命令的更多信息。

生成CRL(證書撤銷列表)

通過Fabric CA SERVER撤銷一個證書后,在Hyperledger Fabric中合適的MSP文件需要進行更新。包括本地的peer節點的MSP與合適的通道配置區塊中的MSP.為了做到這一點,PEM編碼的CRL需要放置到MSP文件夾內的crls文件夾。fabric-ca-client gencrl命令可以生成CRL。任何帶有hf.GenCRL屬性的身份都可以生成包含所有在一個確定的時間被撤銷的證書的序列號的CRL。生成的CRL存儲在<msp 文件夾>/crls/crl.pem文件。

以下的命令將會創建包含所有被撤銷的(超時和未超時)證書的CRL存儲在<msp 文件夾>/crls/crl.pem文件。

export FABRIC_CA_CLIENT_HOME=~/clientconfig
fabric-ca-client gencrl -M ~/msp

...

開啟TLS

這一部分描述如何為Fabric CA客戶端配置TLS的更多細節。

以下部分可以在fabric-ca-client-config.yaml文件中進行配置:

tls:
  enabled: true
  certfiles:
    - root.pem
  client:
    certfile: tls_client-cert.pem
    keyfile: tls_client-key.pem

certfiles選項設置為被客戶端信任的根證書。典型的就是Fabric CA根服務器的證書,ca-cert.pem可以在服務器的主目錄發現.

client選項要求只能手動在服務器進行TLS配置。

基於屬性的訪問控制

...未完待續


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM