Hyperledger fabric 賬號 CA篇 (七)

Hyperledger fabric 賬號 CA篇 (七)

1、Fabric賬號

1.1、含義

​ 根據PKI規範生成的一組證書和密鑰文件

1.2、作用

  • 保證記錄在區塊鏈的數據具有不可逆,防篡改
  • Fabric中每條組織交易都會加上發起者的標籤(簽名證書),同時用發起人的私鑰進行加密
  • 如果交易需要其他組織的節點提供背書功能,那麼背書節點也會在交易中加入自己的簽名

1.3、適用場景

  • 啓動order節點
  • 啓動peer節點
  • 創建通道

2、證書文件

2.1、組織證書

liuhui@liuhui-ThinkPad-T550:~/fabricsample/crypto-config/peerOrganizations/org1.example.com$ tree msp
msp
├── admincerts
├── cacerts
│   └── ca.org1.example.com-cert.pem
├── config.yaml
└── tlscacerts
    └── tlsca.org1.example.com-cert.pem

3 directories, 3 files

2.2、節點證書

liuhui@liuhui-ThinkPad-T550:~/fabricsample/crypto-config/peerOrganizations/org1.example.com/peers$ tree peer0.org1.example.com/
peer0.org1.example.com/
├── msp
│   ├── admincerts
│   ├── cacerts
│   │   └── ca.org1.example.com-cert.pem
│   ├── config.yaml
│   ├── keystore
│   │   └── cf8d9658215ef005bc979d4ef3402dfafdbee7762b131eaaa33031c97d03ae66_sk
│   ├── signcerts
│   │   └── peer0.org1.example.com-cert.pem
│   └── tlscacerts
│       └── tlsca.org1.example.com-cert.pem
└── tls
    ├── ca.crt
    ├── server.crt
    └── server.key

7 directories, 8 files

msp文件夾中內容主要用於存放簽名用的證書文件和加密用的私鑰文件

  • admincerts:管理員證書
  • cacerts:根CA服務器的證書
  • keystore:節點或者賬號的私鑰
  • signcerts:符合X.509的節點或者用戶證書文件
  • tlscacerts:TLS根CA的證書

tls文件夾:存放加密通信相關的證書文件

2.3、用戶證書

liuhui@liuhui-ThinkPad-T550:~/fabricsample/crypto-config/peerOrganizations/org1.example.com/users/[email protected]$ tree msp
msp
├── admincerts
├── cacerts
│   └── ca.org1.example.com-cert.pem
├── config.yaml
├── keystore
│   └── d6f96d6351b1504e31b7612919fb70f2c5a889f8cda4627c4bb5f3c542f3026d_sk
├── signcerts
│   └── [email protected]
└── tlscacerts
    └── tlsca.org1.example.com-cert.pem

5 directories, 5 files

3、Fabric-CA

3.1、含義及架構解析

fabric-ca項目是專門爲了解決fabric賬號問題而發起的一個開源項目,它解決了fabric賬號生成的問題,fabric-ca項目由fabric-server和fabric-client兩個模塊組成,其中fabric-server在fabric中佔有非常重要的作用,我們使用cryptogen命令可以同配置文件生成一些賬號信息,但是如果有動態添加賬號的需求,就無法滿足,所以引入了fabric-ca

![](/home/liuhui/文檔/hyperledge Fabric/fabric-ca.png)

fabric-CA提供了兩種訪問方式調用server服務

  • 通過fabric-client調用
  • 通過SDK調用(node.js,java,go)

通常情況下,一個組織會對應一個fabric-server服務器,根CA可以對子CA進行授權,便可以在子CA中註冊賬號

當fabric中多個組織時,要在每個組織中部署一個fabric-ca服務器,給當前組織註冊新用戶

3.2、安裝Fabric CA

  • 安裝libtool 與libltdl-dev依賴包

    $ sudo apt update
    $ sudo apt install libtool libltdl-dev
    
  • 安裝服務端與客戶端(兩種方式,我是第二種方式安裝成功的,第一種下載失敗)

    (1)直接下載二進制可執行文件

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

    命令下載後會在$GOPATH/bin目錄下產生兩個可執行文件

    • fabric-ca-client
    • fabric-ca-server

    設置環境變量,便於在任何路徑下可以直接使用這兩個命令

    export PATH=$PATH:$GOPATH/bin
    

    (2)從源碼編譯安裝

    github.com下載fabric-ca源碼到hyperledger目錄下

    cd $GOPATH/src/github.com/hyperledger/
    git clone https://github.com/hyperledger/fabric-ca.git
    cd fabric-ca
    #進行源碼編譯
    make fabric-ca-server
    make fabric-ca-client
    

    當前文件下會編譯出一個bin文件夾,最後一步將該文件夾添加到環境變量,保證文件夾下命令可以在任何路徑下執行。

3.3、啓動Fabric-CA

在docker-compose配置文件中添加CA服務,然後運行Shell命令啓動

在docker-compose啓動時使用的配置文件docker-compose.yaml中添加如下配置項

注意:有幾個組織加幾個CA

#配置項中的證書文件和私鑰文件都需要去相應的組織中尋找進行修改
services:
################################添加的內容#####################################
  ca.example.com:                                     # fabric-ca的服務器名,可修改
    image: hyperledger/fabric-ca          #鏡像文件
    environment:
      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server                      #fabric-ca容器中的home目錄
      - FABRIC_CA_SERVER_CA_NAME=ca.example.com                               #fabric-ca服務器的名字,與前面一致
      #fabric-ca服務器證書文件,確定當前fabric-ca屬於哪個組織
      - FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
      #fabric-ca服務器的私鑰文件
      - FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/4239aa0dcd76daeeb8ba0cda701851d14504d31aad1b2ddddbac6a57365e497c_sk
    ports:              #綁定的端口
      - "7054:7054"
       #啓動fabric-ca-server服務命令
       #參數:admin:adminpw(可修改)
       #---admin:fabric-ca-server的登陸用戶名
       #---adminpw: fabric-ca-server的登陸密碼
    command: sh -c 'fabric-ca-server start -b admin:adminpw'                
    volumes:
      - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
    container_name: ca.example.com              #容器名
    networks:
      - basic

運行docker-compose容器

liuhui@liuhui-ThinkPad-T550:~/fabricsample$ docker-compose -f docker-compose-cli.yaml ps
         Name                                 Command                State           Ports         
--------------------------------------------------------------------------------
ca.example.com                    sh -c fabric-ca-server   Up      0.0.0.0:7054->7054/tcp sta ...                                                
cli                                                 /bin/bash                      Up                            
orderer.example.com          orderer                          Up      0.0.0.0:7050->7050/tcp
peer0.org1.example.com   peer node start          Up      0.0.0.0:7051->7051/tcp
peer0.org2.example.com   peer node start          Up      0.0.0.0:9051->9051/tcp
peer1.org1.example.com   peer node start          Up      0.0.0.0:8051->8051/tcp
peer1.org2.example.com   peer node start          Up      0.0.0.0:10051->10051/tcp    

3.4、Fabric CA 命令交互

fabric-ca-server已經啓動,最簡單的方式是使用fabric-ca-client客戶端工具進行交互

fabric-ca-client命令與服務端進行交互,包括5個子命令

  • enroll :註冊獲取ECert
  • register : 登記用戶
  • getcainfo : 獲取CA服務的證書鏈
  • reenroll : 重新註冊
  • revoke: 撤銷簽發的證書身份
  • version:Hyperledger Fabric CA客戶端版本信息

3.4.1、註冊初始化管理員用戶

在fabric CA服務端啓動時有一個管理員用戶,需要先註冊初始化的管理員用戶,獲取註冊證書以後才能進行後續的操作

  • 設置fabric-ca-client所在路徑
  • 設置Hyperledger Fabric CA 客戶端主目錄
  • 調用在7054端口運行的Fabric CA服務器來註冊ID爲admin且密碼爲adminpw的標識(在之前docker-compose.yaml配置文件已經指定)
export PATH=$PATH:$GOPATH/bin
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client enroll -u http://admin:pass@localhost:7054

如果名稱和密碼不匹配,註冊會出現一下錯誤

Error:Response from server: Error Code: 20 - Authorization failure

執行成功後生成的文件結構如下:

liuhui@liuhui-ThinkPad-T550:~$ tree fabric-ca/clients/
fabric-ca/clients/
├── admin
│   ├── fabric-ca-client-config.yaml
│   └── msp
│       ├── cacerts
│       │   └── localhost-7054.pem
│       ├── IssuerPublicKey
│       ├── IssuerRevocationPublicKey
│       ├── keystore
│       │   ├── 813d2ffbd9a55c4ead6b5a93207412fb283f04986b3e927df49106203060f5fc_sk
│       │   └── da9b3f07279f2ca03e1002ccb10b1cf3bed485ed26f30b37491b9072a07974d4_sk
│       ├── signcerts
│       │   └── cert.pem
│       └── user

3.4.2、登記一個新用戶

只有已經註冊的用戶纔可以發起登記(register)請求,發起登記請求的用戶稱爲登記員,登記新用戶的時候還需要有相應的權限,Fabric CA服務端在接收到登記請求時需要進行如下幾個方面的檢查

  1. 登記員需要有登記用戶的登記權限,登記員可以登記的用戶類型記錄在hf.Registrar.Roles屬性中,如果屬性保存的內容爲:peer,app,user。則登記員可以登記peer,app,user類型的用戶,但不能登記orderer類型的用戶。
  2. 登記員只能登記自己歸屬範圍內的用戶,比如登記員歸屬爲a.b,可以登記歸屬a.b.c的用戶,不能登記a.c的用戶。如果不指定登記用戶的歸屬,則默認和登記員的歸屬一樣
  3. 登記的用戶屬性需要滿足以下條件
    • 登記的用戶屬性需要包含在登記員的用戶屬性“hf.Registar.Attributes”中,目前只支持“*“通配符,比如a.b.*表示所有a.b開頭的屬性名稱
    • 如果登記的用戶也有hf.Registar.Attributes屬性,需要其是登記員用戶屬性hf.Registar.Attributes的子集。比如登記員屬性a.b.*,則登記用戶可以爲a.b.c,但不可以爲a.b

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

  • idadmin2
  • affiliationorg1.department1
  • 屬性名字爲hf.Revoker,對應的值爲true
  • 屬性名字爲admin,對應的值爲true

其中對於屬性admin=true,後綴爲ecert表示這條admin屬性將會添加到用戶註冊證書中,實現訪問控制。

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'

命令運行後會輸出該用戶密碼

...
Password: LlkagjaljjgEWj

如果想使用指定的密碼,則需要在命令中添加選項 --id.secret password即可

需要注意:登記時可以將多個屬性指定爲 -id.attrs標誌的一部分,每個屬性必須以逗號分隔。對於包含逗號的屬性值,必須將該屬性封裝在雙引號中。

3.4.3、登記註冊節點

登記peer或orderer節點的操作與登記用戶身份類似,可以用過-M指定本地MSP的根路徑以在其下存放證書文件。

  • 登記一個名爲peer1的節點,密碼爲peer1pw
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
  • 註冊節點
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

命令成功後會在指定MSP文件下生成私鑰和證書

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章