Fabric—Ca的概念不再解釋了,這里只說明使用方法:
前置條件
- Go語言1.10+版本
- GOPATH環境變量正確設置
- 已安裝
libtool
和libtdhl-dev
包
Ubuntu系統
通過以下命令安裝libtool
和libtdhl-dev
包:
sudo apt install libtool libltdl-dev
MacOs 系統
Mac系統通過以下命令安裝:
brew install libtool
Fabric-Ca安裝
可以通過以下兩種途徑進行安裝:
- 直接下載二進制文件:
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服務器的主文件夾,優先級由高到低排序:
- 通過命令行設置參數
--home
設置。 - 如果設置了
FABRIC_CA_SERVER_HOME
環境變量,則使用該環境變量作為主文件夾。 - 如果設置了
FABRIC_CA_HOME
環境變量,則使用該環境變量作為主文件夾。 - 如果設置了
CA_CFG_PATH
環境變量,則使用該環境變量作為主文件夾。 - 如果以上方法都沒有設置,則將當前工作目錄作為主文件夾。
官方建議是通過設置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客戶端的主文件夾,優先級由高到低排序:
- 通過命令行設置參數
--home
設置。 - 如果設置了
FABRIC_CA_CLIENT_HOME
環境變量,則使用該環境變量作為主文件夾。 - 如果設置了
FABRIC_CA_HOME
環境變量,則使用該環境變量作為主文件夾。 - 如果設置了
CA_CFG_PATH
環境變量,則使用該環境變量作為主文件夾。 - 如果以上方法都沒有設置,則
$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
服務器進行三個部分的權限檢查確定當前用戶是否具有權限進行身份的注冊。
- 注冊者必須含有
hf.Registrar.Roles
屬性,並且需要注冊的身份類型必須在該屬性對應的值的列表中存在。比如注冊者的hf.Registrar.Roles
屬性中對應的值只有一個peer
,那么注冊者使能注冊類型為peer
的身份,而不能注冊client
,admin
,orderer
.如果注冊者的hf.Registrar.Roles
屬性對應的值為*
,則說明可以注冊任何類型的身份。 - 簡單說就是上下級關系,比如注冊者所處的部門為
a.b
,那么他只能注冊處於a.b
以及a.b.*
部門的身份,而不能注冊處於a.c
部門的身份。如果需要注冊一個最上級的部門的身份,那么需要將需要將需要注冊的身份的hf.affiliation
指定為.
,並且注冊者所處的部門也需要是最上級的部門。如果在注冊身份時沒有指定所屬的部門,則默認被注冊的身份所處的部門與注冊者部門相同。 - 如果注冊者滿足以下條件則可以注冊帶有屬性的身份:
- 對於
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 id
為admin2
- 部門為
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 id
為admin3
- 身份類型為
client
- 部門為
org1.department1
- 屬性名字為
hf.Revoker
,對應的值為true
- 屬性名字為
anotherAttrName
,對應的值為anotherAttrValue
設置maxenrollments
為0或者是不設置將導致該身份可以使用CA
的最大enrollment
次數。並且一個身份的maxenrollments
不能超過CA
的enrollments
最大值。例如,如果CA
的enrollment
最大值為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
身份的用戶,可以通過指定id
和secret
進行登錄,與之前不同的是需要通過-M
參數指定Hyperledger Fabric MSP
(成員關系服務提供者)文件夾結構。
接下來的命令將會登錄peer1
,確保使用-M
參數指定了peer
的MSP文件夾路徑,該路徑也是peer
的core.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
文件夾是在orderer
的orderer.yaml
文件中通過參數LocalMSPDir
進行設置。
由fabric-ca-server
頒發的所有注冊證書均具有以下組織單位(或簡稱為“ OU”):
- OU層次結構的根等於身份類型。
- 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.Revoker
和hf.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
參數支持的具體的原因:
- unspecified
- keycompromise
- cacompromise
- affiliationchange
- superseded
- cessationofoperation
- certificatehold
- removefromcrl
- privilegewithdrawn
- 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配置。
基於屬性的訪問控制
...未完待續