Fabric CA指南

引言

Fabric CA項(xiàng)目是超級賬本Fabric內(nèi)的MemberService組件, 對網(wǎng)絡(luò)內(nèi)各個(gè)實(shí)體的身份證書的管理, 它提供的功能有:

1. 身份認(rèn)證,或者從 LDAP(輕量目錄訪問協(xié)議) 中獲取注冊信息;

2. 發(fā)行擔(dān)保證書 ECerts (Enrollment Certificates);

3. 發(fā)行交易證書 TCerts (Transaction Certificates),保障 Hyperledger Fabric 區(qū)域鏈交易平臺上的信息匿名性和不可追蹤性;

4. 證書更新和撤銷。

Fabric CA 屬于典型的 CS (Client and Server) 架構(gòu),官方代碼庫:https://github.com/hyperledger/fabric-ca 。

Fabric CA采用Go語言進(jìn)行編寫。

本文主要參考:https://hyperledger-fabric-ca.readthedocs.io/en/latest/users-guide.html#getting-started

一. 概述


上圖展現(xiàn)了 Fabric CA 服務(wù)端是如何參與到 Hyperledger Fabric 整體架構(gòu)中去的。?

與 Fabric CA 服務(wù)端交互的方式有如下兩種:

1. 通過 Fabric CA 客戶端

2. 使用Fabric SDK

與 Fabric CA 服務(wù)端的所有通信,都是通過 REST API 進(jìn)行的。詳情可查看?fabric-ca/swagger/swagger-fabric-ca.json 處的 swagger 文檔中的 REST API 部分。

如前圖所示,F(xiàn)abric CA 客戶端或 SDK 的請求首先會到達(dá) Fabric CA 集群前端的高可用負(fù)載均衡服務(wù)端,實(shí)際的 CA 服務(wù)由后端的某臺Fabric CA 服務(wù)端提供。同一集群中的所有 Fabric CA 服務(wù)端共享相同的后端數(shù)據(jù)庫(或 LDAP)集群,以確保證書和身份的一致性。

二. 安裝

2.1 前提條件

1. 安裝好 Go 1.10.x

2. 正確設(shè)置?`GOPATH`環(huán)境變量

3. 安裝好libtool 和 libtdhl-dev 包

在Ubuntu上安裝libtool:

#?sudo apt install libtool libltdl-dev

安裝 fabric-ca-server 與 fabric-ca-client 兩個(gè)終端命令行工具。

#?go get -u github.com/hyperledger/fabric-ca/cmd/...?

2.2 啟動服務(wù)端:本地環(huán)境

如下所示,將按默認(rèn)配置啟動 Fabric CA 服務(wù)端,-b 選項(xiàng)用于指定管理員的賬號與密碼。

# fabric-ca-server start -b admin:adminpw

默認(rèn)將在當(dāng)前目錄創(chuàng)建一個(gè)名為 fabric-ca-server-config.yaml?的配置文件,該文件的存儲位置也可以另行指定。

2.3 啟動服務(wù)端:Docker 環(huán)境

也可以選擇在 Docker 環(huán)境下運(yùn)行服務(wù)端,如下將創(chuàng)建并通過 docker-compose 啟動服務(wù)端

# cd $GOPATH/src/github.com/hyperledger/fabric-ca

# make docker

# cd docker/server

# docker-compose up -d

名為 hyperledger/fabric-ca 的 docker 鏡像中包含了 fabric-ca-server 與 fabric-ca-client 命令行工具。?

三. 使用Fabric CA CLI

至此,F(xiàn)abric CA的環(huán)境已搭建完畢??梢允褂孟嚓P(guān)命令進(jìn)行操作,具體包括兩部分:

1 Fabric CA server 命令,具體使用請參考:https://hyperledger-fabric-ca.readthedocs.io/en/latest/servercli.html

2 Fabric CA client 命令,具體使用請參考:https://hyperledger-fabric-ca.readthedocs.io/en/latest/clientcli.html

四. 配置方法及其優(yōu)先級

Fabric CA 有三種設(shè)置配置的方法(優(yōu)先級由高到低): :

1. CLI 參數(shù)

2. 環(huán)境變量

3. 配置文件

以下內(nèi)容中,將演示如何改配置文件,但是配置文件的設(shè)置會被環(huán)境變量及CLI參數(shù)覆蓋。

如下是client的配置文件:

下面的環(huán)境變量將會覆蓋上面的配置:

export FABRIC_CA_CLIENT_TLS_CLIENT_CERTFILE=cert2.pem

下面這個(gè)CLI參數(shù)能覆蓋配置文件和環(huán)境變量:

fabric-ca-client enroll --tls.client.certfile cert3.pem

fabric-ca-server服務(wù)器也一樣, 只不過環(huán)境變量名不是以?FABIRC_CA_CLIENT?開頭,而是FABRIC_CA_SERVER?。

五. Fabric CA 服務(wù)器

在啟動服務(wù)器前要先初始化它。這個(gè)過程會產(chǎn)生一份默認(rèn)的配置文件,然后你可以檢查并修改。

Fabric CA服務(wù)器的home目錄是這樣決定的:

1 如果設(shè)置了?FABRIC_CA_SERVER_HOME?環(huán)境變量, 則就取它的值

2 否則就取?FABRIC_CA_HOME?的值

3 否則就取?CA_CFG_PATH?的值

4 否則就用當(dāng)前的工作目錄

在本章節(jié)中, 我們假設(shè)已經(jīng)設(shè)置了環(huán)境變量?FABRIC_CA_HOME?為$HOME/fabric-ca/server。

下面的指令假設(shè)你已經(jīng)將配置文件放在了服務(wù)器的home目錄下。

5.1 服務(wù)端命令剖析

fabric-ca-server命令主要負(fù)責(zé)啟動一個(gè)CA服務(wù), 包括init和start兩個(gè)子命令

用以下語句初始化CA服務(wù)器:

fabric-ca-server init -b admin:adminpw

當(dāng)LDAP被禁用時(shí),就必須要有這個(gè)?-b?(代表“啟動身份”bootstrap identity) 選項(xiàng)。 啟動服務(wù)器必須要有啟動身份; 這個(gè)身份就是管理員身份。

生成的配置文件fabric-ca-server-config.yaml類似下圖:


配置文件里可以配置證書簽名請求域 (Certificate Signing Request簡稱CSR),以下就是一個(gè)CSR域的示例。


以上所有字段都對應(yīng)了X.509證書的字段,即調(diào)用?fabric-ca-server?init?生成的證書字段。 這個(gè)CSR的域設(shè)置效果等同于配置中的?ca.certfile?和?ca.keyfile?兩個(gè)配置域的組合。 配置了CSR域就是用這些信息自己給自己簽名,ca.certfile和ca.keyfile是用這兩個(gè)文件自簽名。

字段解釋如下:

cn?證書名Common Name

O?組織名organization name

OU?組織單元organizational unit

L?位置location or city

ST?州state

C?國家country

如果要配置CSR,就要把?ca.certfile?和?ca-keyfile?對應(yīng)的文件刪了。(官方默認(rèn)是ca-cert.pem和ca-key.pem) 然后重新運(yùn)行一下?fabric-ca-server?init?-b?admin:adminpw

fabric-ca-server?init?命令會生成一個(gè)自簽名證書。

如果你要指定 CA 簽名證書 和 key 文件, 你就得把文件放到?ca.certfile?和?ca.keyfile?的指定路徑下。?

文件必須是PEM格式且不可加密。此處摘抄一句英文原文:

Both files must be PEM-encoded and must not be encrypted.

CA簽名證書必須以?-----BEGIN?CERTIFICATE-----?開頭。 key 文件必須以?-----BEGIN?PRIVATE?KEY-----?開頭,而不是-----BEGIN?ENCRYPTED?PRIVATE?KEY-----。

5.2 啟動服務(wù)器

用以下命令啟動CA服務(wù)器:

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

第一次啟動時(shí),如果服務(wù)器未初始化,則會先進(jìn)行初始化。

在初始化期間,如果發(fā)現(xiàn) ca-cert.pem 和 ca-key.pem 不存在,則會先生成,如果配置文件不存在也會生成默認(rèn)的配置文件。?

除非你用的是LDAP,否則你必須要先有一個(gè)預(yù)先注冊好的bootstrap身份信息用來注冊和登記其他身份信息。 用?-b?選項(xiàng)來指定bootstrap身份。

如果要讓服務(wù)器監(jiān)聽?https?而不是?http,則需要設(shè)置?tls.enabled?為?true。

要限制同一個(gè) secret (或 password) 的登記使用次數(shù),需要給?registry.maxenrollments?配置項(xiàng)設(shè)置一個(gè)值。 如果設(shè)置為1, 則每個(gè) enrollment ID只能被登記一次,如果設(shè)置為 -1, 則secret的登記使用次數(shù)不做限制。 默認(rèn)值是-1。 如果設(shè)置為0, 則所有的身份或者是注冊進(jìn)來的身份都不能被登記了。

啟動后,CA服務(wù)器監(jiān)聽端口是 7054。

六. Fabric CA 客戶端

6.1 準(zhǔn)備工作

本節(jié)講述如何使用fabric-ca-client的命令。

首先,要先確定Fabric CA client的home目錄,其決定順序如下:

命令行 -home 選項(xiàng)

環(huán)境變量?FABRIC_CA_CLIENT_HOME

環(huán)境變量?FABRIC_CA_HOME

環(huán)境變量?CA_CFG_PATH

$HOME/.fabric-ca-client

請將配置文件放home目錄下后,完成以下過程。

enroll the bootstrap identity

CA的賬號概念是:先注冊identity,它帶有一個(gè)enrollment id,然后可以enroll具體的賬號,可以在csr里指定屬性。

一個(gè)賬號的生命周期如下圖所示:

(注:register字面的意思是注冊,注冊就是主體向 CA 自我介紹的過程;enroll字面的意思是登記,就是最終實(shí)體進(jìn)行證書申請并從 CA 接收證書的過程)

從創(chuàng)建超級管理員到注冊用戶過程如下:

bootstrap identity即超級管理員identity,注冊是在ca-server初始化時(shí)完成的(用-b 選項(xiàng)指定enrollment ID和密碼)。

client端配置好CSR,并enroll了超級管理員identity到home目錄下的msp

client去向CA register user的identity,CA認(rèn)可client的msp,client去向CA enroll 剛才user的msp。

根據(jù)需要自定義client home目錄下配置文件中的CSR部分,其中``csr.cn``必須設(shè)置為bootstrap identity的enrollment ID。

然后運(yùn)行?fabric-ca-client?enroll?命令去enroll一個(gè)identity。例如, 以下命令會enroll一個(gè)ID是?admin?密碼是?adminpw?的identity, 其調(diào)用的是運(yùn)行在本地的監(jiān)聽7054端口的Fabric CA 服務(wù)器。

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin

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

enroll命令會生成一份enrollment 證書 (ECert), 以及對應(yīng)的私鑰文件和CA根證書 PEM 文件 ,保存在Fabric CA client的?msp?子目錄下。 提示信息里會告訴你保存到哪個(gè)目錄。

6.2 注冊一個(gè)新identity

發(fā)起注冊請求的身份必須是已經(jīng)登記(enroll)過的,同時(shí)也必須有權(quán)限去注冊要注冊的相應(yīng)類型的身份。

在register期間,CA server會做兩個(gè)授權(quán)檢查:

調(diào)用者要register的身份必須是其“hf.Registrar.Roles”屬性中所指明的身份中的一個(gè)。 例如調(diào)用者的“hf.Registrar.Roles”屬性值為“peer,app,user”,那么他不能register orderer類型的identity。

調(diào)用者identity的從屬關(guān)系必須等于要register時(shí)候的從屬關(guān)系的前綴。 例如,一個(gè)調(diào)用者的從屬關(guān)系是“a.b”,

那么他可以register一個(gè)擁有”a.b.c”的identity, 但不能是“a.c”。

下文的命令用admin identity去register一個(gè)新的identity,他的enrollment id是admin2, 類型是user,從屬關(guān)系是org1.department1,hf.Revoker屬性的值為true,foo屬性的值為bar。

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin

fabric-ca-client register --id.name admin2 --id.type user --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,foo=bar'

CA server會返回一個(gè)密碼,用于這個(gè)identity去enroll。 也允許一個(gè)管理員去register一個(gè)identity, 然后將這個(gè)identity對應(yīng)的enrollment ID和密碼給其他人去enroll。

如果設(shè)置?maxenrollments?為 0 或者不設(shè)置則其默認(rèn)值為 CA的 最大 enrollment 值。 這個(gè)注冊用戶的最大enroll值不能超過CA的最大enroll值, 比如CA的最大值設(shè)置為是5,則所有注冊的身份只能小于等于 5, 而且也不能設(shè)置為 -1 (無限enroll).

下面我們注冊一個(gè)?peer1?用戶,注意這里我們指定了密碼,而不是讓命令為我們生成一個(gè)默認(rèn)密碼。

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 peer1p

6.3 Enroll一個(gè) Peer identity

注冊好身份后就可以enroll,enroll需要使用剛才注冊的enrollmentID和密碼(比如上節(jié)例子里的?password?)。這個(gè)enroll和enroll bootstrap身份有點(diǎn)像,只不過我們這里還用到了 “-M” 選項(xiàng) 用于指定生成 MSP (Membership Service Provider) 目錄結(jié)構(gòu)。

以下是enroll一個(gè) peer1。 確保 “-M” 指定的目錄為你的 peer的 MSP 目錄, 要與peer的core.yaml文件里設(shè)置的 ‘mspConfigPath’ 值要保持一致。 你也可以設(shè)置 FABRIC_CA_CLIENT_HOME 為你的 peer的home目錄。

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

enroll一個(gè)orderer也類似,只不過-M指定的是orderer.yaml里的 ‘LocalMSPDir’ 。

6.4 重新enroll一個(gè)identity

假設(shè)你的證書到期了,就需要用以下命令重新enroll一份了

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

fabric-ca-client reenroll

6.5 撤銷一個(gè)證書或一個(gè)identity

撤銷一個(gè)identity會撤銷他的所有證書,并阻止他再得到新的證書,撤銷一個(gè)證書只是使一個(gè)證書無效。 撤銷者的從屬關(guān)系是orgs.org1可以撤銷從屬關(guān)系是orgs.org1和orgs.org1.department1的identity,但不能撤銷orgs.org1的identity。

例子:bootstrap admin這個(gè)超級用戶可以撤銷**peer1**這個(gè)身份

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin

fabric-ca-client revoke -e peer1

6.6 客戶端命令剖析

fabric-ca-client命令可以與服務(wù)端進(jìn)行交互, 包括五個(gè)子命令:

enroll: 登錄獲取ECert

getcacert: 獲取CA服務(wù)的證書鏈

reenroll: 再次登錄

register: 注冊用戶實(shí)體

revoke: 吊銷簽發(fā)的實(shí)體證書

6.6.1 enroll命令

向服務(wù)端申請簽發(fā)ECert證書并將文件保存至本地

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

6.6.2 getcacert命令

向服務(wù)端申請根證書信息并保存至本地主配置目錄的msp/cacerts路徑下

$ fabric-ca-client getcacert -u http://admin:pass@localhost:7054

證書命名格式為: 服務(wù)器主機(jī)名-CA實(shí)例名.pem

6.6.3 reenroll命令

利用本地配置信息再次執(zhí)行enroll過程, 生成新的簽名證書材料

$ fabric-ca-client reenroll

6.6.4 register命令

執(zhí)行注冊新用戶實(shí)體的客戶端必須已經(jīng)通過登記認(rèn)證, 并且擁有足夠的權(quán)限(所注冊用戶的hf.Registrar.Roles和affiliation都不能超出調(diào)用者屬性)來進(jìn)行注冊

$ fabric-ca-client register --id.name jack --id.type user --id.affiliation org1.department1 --id.attrs'"hf.Registrar.Roles=peer,user"'--id.attrs'hf.Revoker=true'--id.secret jackpw

6.6.5 revoke命令

吊銷指定的證書或指定實(shí)體相關(guān)的所有證書. 執(zhí)行revoke命令的客戶端身份必須擁有足夠的權(quán)限(hf.Revoker為true, 并且被吊銷者機(jī)構(gòu)不能超出吊銷者機(jī)構(gòu)的范圍)

$ fabric-ca-client revoke -e "jack" -r "affiliationchange"

-e: 指定吊銷用戶

-r: 指定吊銷原因

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容