Hyperledger Fabric-CA學習


Hyperleder Fabric系統架構核心邏輯包括MemberShipBlockchainChaincode

其中上述3個核心邏輯中,Membership服務用來管理節點身份、隱私、confidentiality auditability。在一個 non-permissioned的區塊鏈網絡里,參與者不要求授權,所有的節點被視作一樣,都可以提交一個transaction,去把這些交易存到區塊(blocks)中。Membership Service將一個 non-permissioned的區塊鏈網絡變成一個permissioned的區塊鏈網絡,憑借着Public Key Infrastructure (PKI)、去中心和一致性。

從上面的描述中可以看出,對於一個隱私性要求較高,節點需要授權才可以加入區塊鏈網絡並節點可能存在不同角色的區塊鏈我那個落,Membership從中起到授權用戶、加密傳輸數據的作用。在Fabric 1.0版本中,MemberShip Service替換成fabric-ca模塊。由於CApemissioned區塊鏈網絡中的重要作用,Fabric也將CA作為一個單獨的模塊,可以獨立運行,其代碼可從https://github.com/hyperledger/fabric-ca獲取得到。


下面的圖表描述了CA 服務器在Hyperleder Fabric框架體系架構中的工作方式:

從表中可以看出,CA 服務器結構為樹形結構,整個樹形結構的根節點為根CARoot Server),存在多個中間CAIntermediate CA),圖中每個中間CA服務器上可以配置一個CA服務集群,CA服務集群通過前置的HAproxy實現負載均衡。

Fabric CA提供了兩種訪問方式調用Server服務,一種是通過Client調用,另一種是通過SDK調用。兩種調用都是REST風格的。本文使用的是通過Client調用。


接下來,參考fabric-ca官方文檔說明要求,針對fabric-ca的請求/發放證書、注冊節點等操作實踐操作一遍已加深理解。

首先安裝啟動fabric ca,啟動fabric-ca可以通過docker和下載fabric-ca至本地啟動兩種方式,下文安裝了fabric-ca在本地並啟動:

本地啟動fabric-ca的准備條件:

1、安裝Go 1.7以上版本

2、正確配置了GOPATH環境變量

3libtoollibtdhl-dev包已安裝

通過運行命令: go get -u github.com/hyperledger/fabric-ca/cmd/...

上述命令可以安裝fabric-ca-serverfabric-ca-client$GOPATH/bin目錄下



執行上述命令后,在GOPATH/bin下可以看到fabric-ca-serverfabric-ca-client已經正常啟動了。


啟動fabric-ca-server:

fabric-ca-server start -b admin:adminpw

其中-b參數提供了節點登記過程的引導節點,后面登記節點時需要用到。

使用命令fabric-ca-server start -b admin:adminpw --cacount 2啟動了一個包含了2CA服務簇的CA server

啟動CA server后,在服務器根目錄下分別新建了一個ca1ca2兩個文件夾,啟動過程中服務器首先通過ecdsa SHA256算法生成密鑰,然后編碼生成CSR(證書簽名請求,CSR簽名請求中包含了請求用戶的城市、公司等基本信息),CA服務器對CSR中的基本信息通過數字簽名制作數字證書並頒發給申請者。上圖可以看出最終生成的CA證書最終存儲在ca1ca2文件夾下的ca-cert.pem文件里。生成數字證書后,CA服務器會將證書信息寫入到數據庫或LDAP目錄服務器中。上圖中默認存放在ca1ca2文件夾下的sqlite3 db中。

上圖為執行服務器啟動后生成的目錄結構,其中fabric-ca-config.yaml是啟動過程中所使用的配置文件。

切換到ca1文件夾下,通過openssl命令查看證書內容:

 

如圖可以看到,數字證書包含了簽名算法信息、申請者基本信息、申請者公鑰信息等。
打開存儲發放證書信息的sqlite3 數據庫:


可以看到數據庫中有3個表,其中users表中目前只有啟動時設定的引導節點,還沒有注冊其他節點。certificates表中目前沒有任何發放證書記錄。
現在我們嘗試使用fabric-ca先登記引導節點,命令如下:
fabric-ca-client enroll -u http://admin:adminpw@localhost:7054
這里admin和adminpw即為fabric-ca-server啟動時設置的引導節點登記id和密碼
client執行結果如下:

server端接收到登記請求:

在ca-client目錄下生成的目錄結構如下:

其中msp/signcerts目錄下存儲的為client的數字證書,cacerts目錄下存儲的為證書鏈信息。
回到ca-server目錄下,打開sqlite3數據庫,可以看到剛剛頒發的數字證書已經記錄在數據庫里了。

接下來使用fabric-ca-client注冊一個新的節點,這一步就是為fabric中的peer、user角色進行注冊並登記的過程了,注冊的命令為:
fabric-ca-client register --id.name admin2 --id.type user --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,foo=bar'
這里有兩點需要注意:
1、--id.type參數必須是是server端配置文件里hf.Registrar.Roles屬性值里的一個
打開fabric-ca-server的配置文件

其中通過hf.Registrar.Roles的屬性值可以看出,客戶端可以注冊的類型有client,user,peer,validator和auditor
2、--id.affiliation這個屬性表示:被注冊對象的從屬關系參數一定要歸屬於預先配置的組織屬性。換句話說,被注冊對象的affiliation參數一定要是預先配置的affiliation參數的一個前綴。例如,假設預先配置的組織關系為:“a.b.c”,那么新注冊的對象的affiliation屬性可以是“a.b.c”,也可以是“a.b”,但“a.c”就不能通過注冊。
執行節點注冊命令后,注冊了一個user結點:
client端執行結果:

這里分配的password需要記住,后面在登記該節點時會用到。
server端接收到請求

登記剛剛注冊過的admin2節點,登記命令為:
fabric-ca-client enroll -u http://admin2:wtLafXUdYMOa@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/msp
這里登記時使用的erollId和密碼就是上邊注冊過程中的節點名稱和返回的密碼信息。這冊過程中也是可以指定密碼的。
執行登記命令,結果如下:

打開fabric-ca-server的sqlite數據庫

查看用戶信息,其中有一個client節點admin和一個user節點admin2。其中admin是一個intermediateCA。
打開數據庫表certificates,這是可以看到給admin2所頒發的證書已經記錄了。

重新登記節點,在節點授權即將到期是需要重新登記節點信息。重新登記的命令為:
fabric-ca-client reenroll

重新登記過程重新發送簽名證書請求,獲取新的數字證書。
打開server端數據庫,可以看到兩條頒發給節點admin2的證書記錄,兩個證書頒發的時間不一樣。

注銷證書,注銷證書的命令為:fabric-ca-client revoke -e <enrollment_id> -r <reason>
其中reason參數可以為:
1. keycompromise
2. cacompromise
3. affiliationchange
4. superseded
5. cessationofoperation
6. certificatehold
7. removefromcrl
8. privilegewithdrawn
9. aacompromise
10. unspecified
下面我們注銷掉剛剛登記的admin2節點試一下,執行命令fabric-ca-client revoke -e admin2:
執行結果如下:

打開server端數據庫:
可以看出admin2節點的證書狀態已經改為注銷了。

注冊一個中間CA,具體命令為:fabric-ca-server start -b admin1:adminpw1 -u http://admin:adminpw@localhost:7054
上述命令重新啟動了一個CA服務器,作為引導節點CA服務器下的中間CA,執行結果如下:

服務端執行結果:

打開ca-chain.pem查看剛剛登記的中間CA服務器證書鏈:

可以看到證書鏈中包含上級CA證書和自己的證書信息。
嘗試在剛剛建立的CA上注冊登記一個節點,注冊一個節點admin2的命令同上:
首先登記節點:

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

注冊的結果已經記錄在數據庫中:

最后登記節點,執行命令:fabric-ca-client enroll -u http://admin2:OvcuMeebLLty@localhost:7055 -M $FABRIC_CA_CLIENT_HOME/msp

進入剛剛登記的節點目錄,生成如下目錄結構:

打開cacerts下面的證書鏈文件,可以看到剛剛登記的節點證書鏈包含兩個中間CA的數字證書信息,在驗證由該個樹形CA服務器中一個中間CA節點所頒發的數字證書是否真實有效時,會按照證書鏈自下向上進行驗證,直至到達根證書。

如果區塊鏈網絡中有多個鏈,每個鏈為了保證各自的隱私性存在各自的CA服務器,那么當一個用戶同時擁有兩個鏈的權限時,怎樣同時具備驗證兩個鏈上的節點所擁有的CA證書呢?按照上邊證書鏈的原則,一個節點注冊登記到一個中間CA后,應該只能擁有該條CA服務器鏈上的證書鏈。這里為了解決這個問題,有一種方法是交叉認證,在fabric-ca中也有類似的操作方法,即通過Restful接口獲取另外一個CA服務器上的證書鏈。
具體命令為:fabric-ca-client getcacert -u http://localhost:7055 -M $FABRIC_CA_CLIENT_HOME/msp
這里我們新建一個單獨運行的CA服務器:

查看該根服務器的數字證書:

接下來,我們在上文登記的節點admin2上運行獲取剛剛建立的CA服務器證書鏈命令:

執行命令結束后,查看admin2節點所對應的證書鏈目錄:

可以看到啟動在端口7056上的CA服務器所對應的證書鏈已經同步過來了。

Fabric-ca這個模塊詳細描述了CA工作過程中使用fabric-ca-client和sdk方式的方法,其中包括配置LDAP以及其他數據庫的配置方法在文中也有說明,sdk方式的restful操作接口,可以查看fabric-ca源碼根目錄下的swagger.json文件。使用中需要根據區塊鏈網絡的特性,使用CA簽發的數字證書進行認證、加密傳輸數據、授權用戶、管理用戶證書。


 


免責聲明!

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



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