區塊鏈研究實驗室|Hyperledger Fabric的CA操作指南-part1

買賣虛擬貨幣

簡介

作為許可的區塊鏈平臺,Hyperledger Fabric要求識別所有實體,無論是網路元件還是使用該平臺的使用者(客戶端)。該識別透過數字證書來實現,並且需要用於證書發頒發和管理的基礎設施。

雖然可以使用第三方來構建這個基礎設施,但是Fabric CA提供了一種方便的方法,它可以生成Hyperledger Fabric系統所需的適當格式。在readthedoc中有一個很好的教程,《 Fabric CA操作指南》。它建立了一個典型的設定,並提供了非常詳細的逐步說明。在實驗過程中,我們會在各個角度進行某些觀察以獲得更全面的瞭解。同時,為了更好地工作,我還修正了一些命名不一致的問題,並更新了配置檔案。希望這對您在學習本教程時有所幫助。

教程概述

Organization設定

整個設定總結如下:

1. 三個Organization:org0 是orderer organization, org1和org2 是peer organizations

2. org0有一個orderer(orderer1-org0),用於在Solo中提供orderer服務。

3. 在每個peer organizations(org1和org2)中,都有peer organizations(peer1-orgx,peer2-orgx)

4. 每個Organization都有一個管理員使用者(admin-orgx)

以下是總體情況,供我們參考。我們將在下一部分立即解釋最後一個專欄。

證書頒發機構設定

如果從CA角度看設定,那麼本教程中有四個CA:

TLS-CA:CA為整個網路的網路元件(訂購者和對等方)頒發TLS伺服器證書。該證書僅用於TLS通訊,並且與該結構網路中的身份有關。

RCA-ORGx(x = 0,1,2):它是每個organization中身份的根CA。一方面,它向元件和使用者頒發所需的證書。另一方面,它代表形成結構網路時的organization(以MSP方式)。

最後一列供快速參考。我們將在本教程的後面部分看到這些目錄。

本教程中使用的CA的摘要

完成證書頒發並完成結構網路設定後,在日常操作中不需要這些ca。他們不參與加入通道,部署鏈碼,呼叫鏈碼功能等。僅當新元件(新增一個orderer或多個peer)或新使用者(新增更多客戶端應用程式)加入設定和新證書時才需要它們生成。

操作流程:

這是本教程的整體流程(注意:這只是顯示了一系列任務,此處顯示的步驟不是教程中顯示的步驟)

1. 啟動四個CA,每個CA作為執行在容器中的Fabric-CA-Server。

2. 在localhost使用Fabric-CA-Client與這些CA進行互動。對於每個CA,請註冊一個註冊商,然後根據我們的教程設計開始所有organization的實體註冊。

3. 對於每個organization,請使用Fabric-CA-Client來註冊在2中註冊的實體。現在,我們擁有所需的所有加密材料。

4. 將生成的加密材料放置在適當的目錄中,這些目錄將對映到docker-compose檔案中定義的那些元件(order和peer)中。

5. 為每個組織準備MSP目錄,建立結構網路時需要該目錄。

6. 開啟五個容器(一個order,四個peer)和兩個CLI容器。

7. 建立通道並將peers連線到通道

8. 部署鏈碼並觀察鏈碼中基於屬性的訪問控制(ABAC)功能。

配置檔案

有兩個配置檔案:docker-compose檔案(docker-compose.yaml)和通道工件檔案(configtx.yaml)。

docker-compose.yaml被修改和更新以反映更改。

version:'2'networks:fabric-ca:services:ca-tls:container_name:ca-tlsimage:hyperledger/fabric-ca:1.4.2command:sh-c'fabric-ca-serverstart-d-btls-ca-admin:tls-ca-adminpw--port7052'environment:-FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto-FABRIC_CA_SERVER_TLS_ENABLED=true-FABRIC_CA_SERVER_CSR_CN=tls-ca-FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0-FABRIC_CA_SERVER_DEBUG=truevolumes:-/tmp/hyperledger/tls-ca:/tmp/hyperledger/fabric-canetworks:-fabric-caports:-7052:7052rca-org0:container_name:rca-org0image:hyperledger/fabric-ca:1.4.2command:sh-c'fabric-ca-serverstart-d-brca-org0-admin:rca-org0-adminpw--port7053'environment:-FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto-FABRIC_CA_SERVER_TLS_ENABLED=true-FABRIC_CA_SERVER_CSR_CN=rca-org0-FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0-FABRIC_CA_SERVER_DEBUG=truevolumes:-/tmp/hyperledger/org0/ca:/tmp/hyperledger/fabric-canetworks:-fabric-caports:-7053:7053rca-org1:container_name:rca-org1image:hyperledger/fabric-ca:1.4.2command:sh-c'fabric-ca-serverstart-d-brca-org1-admin:rca-org1-adminpw--port7054'environment:-FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto-FABRIC_CA_SERVER_TLS_ENABLED=true-FABRIC_CA_SERVER_CSR_CN=rca-org1-FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0-FABRIC_CA_SERVER_DEBUG=truevolumes:-/tmp/hyperledger/org1/ca:/tmp/hyperledger/fabric-canetworks:-fabric-caports:-7054:7054rca-org2:container_name:rca-org2image:hyperledger/fabric-ca:1.4.2command:/bin/bash-c'fabric-ca-serverstart-d-brca-org2-admin:rca-org2-adminpw--port7055'environment:-FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto-FABRIC_CA_SERVER_TLS_ENABLED=true-FABRIC_CA_SERVER_CSR_CN=rca-org2-FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0-FABRIC_CA_SERVER_DEBUG=truevolumes:-/tmp/hyperledger/org2/ca:/tmp/hyperledger/fabric-canetworks:-fabric-caports:-7055:7055peer1-org1:container_name:peer1-org1image:hyperledger/fabric-peer:1.4.2environment:-CORE_PEER_ID=peer1-org1-CORE_PEER_ADDRESS=peer1-org1:7051-CORE_PEER_LOCALMSPID=org1MSP-CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/peer1/msp-CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock-CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=guide_fabric-ca-FABRIC_LOGGING_SPEC=info-CORE_PEER_TLS_ENABLED=true-CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/signcerts/cert.pem-CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org1/peer1/tls-msp/keystore/key.pem-CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem-CORE_PEER_GOSSIP_USELEADERELECTION=true-CORE_PEER_GOSSIP_ORGLEADER=false-CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-org1:7051-CORE_PEER_GOSSIP_SKIPHANDSHAKE=trueworking_dir:/opt/gopath/src/github.com/hyperledger/fabric/org1/peer1volumes:-/var/run:/host/var/run-/tmp/hyperledger/org1/peer1:/tmp/hyperledger/org1/peer1networks:-fabric-capeer2-org1:container_name:peer2-org1image:hyperledger/fabric-peer:1.4.2environment:-CORE_PEER_ID=peer2-org1-CORE_PEER_ADDRESS=peer2-org1:7051-CORE_PEER_LOCALMSPID=org1MSP-CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/peer2/msp-CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock-CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=guide_fabric-ca-FABRIC_LOGGING_SPEC=info-CORE_PEER_TLS_ENABLED=true-CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org1/peer2/tls-msp/signcerts/cert.pem-CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org1/peer2/tls-msp/keystore/key.pem-CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org1/peer2/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem-CORE_PEER_GOSSIP_USELEADERELECTION=true-CORE_PEER_GOSSIP_ORGLEADER=false-CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer2-org1:7051-CORE_PEER_GOSSIP_SKIPHANDSHAKE=true-CORE_PEER_GOSSIP_BOOTSTRAP=peer1-org1:7051working_dir:/opt/gopath/src/github.com/hyperledger/fabric/org1/peer2volumes:-/var/run:/host/var/run-/tmp/hyperledger/org1/peer2:/tmp/hyperledger/org1/peer2networks:-fabric-capeer1-org2:container_name:peer1-org2image:hyperledger/fabric-peer:1.4.2environment:-CORE_PEER_ID=peer1-org2-CORE_PEER_ADDRESS=peer1-org2:7051-CORE_PEER_LOCALMSPID=org2MSP-CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/peer1/msp-CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock-CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=guide_fabric-ca-FABRIC_LOGGING_SPEC=info-CORE_PEER_TLS_ENABLED=true-CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org2/peer1/tls-msp/signcerts/cert.pem-CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org2/peer1/tls-msp/keystore/key.pem-CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org2/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem-CORE_PEER_GOSSIP_USELEADERELECTION=true-CORE_PEER_GOSSIP_ORGLEADER=false-CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1-org2:7051-CORE_PEER_GOSSIP_SKIPHANDSHAKE=trueworking_dir:/opt/gopath/src/github.com/hyperledger/fabric/org2/peer1volumes:-/var/run:/host/var/run-/tmp/hyperledger/org2/peer1:/tmp/hyperledger/org2/peer1networks:-fabric-capeer2-org2:container_name:peer2-org2image:hyperledger/fabric-peer:1.4.2environment:-CORE_PEER_ID=peer2-org2-CORE_PEER_ADDRESS=peer2-org2:7051-CORE_PEER_LOCALMSPID=org2MSP-CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/peer2/msp-CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock-CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=guide_fabric-ca-FABRIC_LOGGING_SPEC=info-CORE_PEER_TLS_ENABLED=true-CORE_PEER_TLS_CERT_FILE=/tmp/hyperledger/org2/peer2/tls-msp/signcerts/cert.pem-CORE_PEER_TLS_KEY_FILE=/tmp/hyperledger/org2/peer2/tls-msp/keystore/key.pem-CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org2/peer2/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem-CORE_PEER_GOSSIP_USELEADERELECTION=true-CORE_PEER_GOSSIP_ORGLEADER=false-CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer2-org2:7051-CORE_PEER_GOSSIP_SKIPHANDSHAKE=true-CORE_PEER_GOSSIP_BOOTSTRAP=peer1-org2:7051working_dir:/opt/gopath/src/github.com/hyperledger/fabric/org2/peer2volumes:-/var/run:/host/var/run-/tmp/hyperledger/org2/peer2:/tmp/hyperledger/org2/peer2networks:-fabric-caorderer1-org0:container_name:orderer1-org0image:hyperledger/fabric-orderer:1.4.2environment:-ORDERER_HOME=/tmp/hyperledger/orderer-ORDERER_HOST=orderer1-org0-ORDERER_GENERAL_LISTENADDRESS=0.0.0.0-ORDERER_GENERAL_GENESISMETHOD=file-ORDERER_GENERAL_GENESISFILE=/tmp/hyperledger/org0/orderer/genesis.block-ORDERER_GENERAL_LOCALMSPID=org0MSP-ORDERER_GENERAL_LOCALMSPDIR=/tmp/hyperledger/org0/orderer/msp-ORDERER_GENERAL_TLS_ENABLED=true-ORDERER_GENERAL_TLS_CERTIFICATE=/tmp/hyperledger/org0/orderer/tls-msp/signcerts/cert.pem-ORDERER_GENERAL_TLS_PRIVATEKEY=/tmp/hyperledger/org0/orderer/tls-msp/keystore/key.pem-ORDERER_GENERAL_TLS_ROOTCAS=[/tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem]-ORDERER_GENERAL_LOGLEVEL=debug-ORDERER_DEBUG_BROADCASTTRACEDIR=data/logsvolumes:-/tmp/hyperledger/org0/orderer:/tmp/hyperledger/org0/orderer/networks:-fabric-cacli-org1:container_name:cli-org1image:hyperledger/fabric-tools:1.4.2tty:truestdin_open:trueenvironment:-GOPATH=/opt/gopath-FABRIC_LOGGING_SPEC=INFO-CORE_PEER_ID=cli-CORE_PEER_ADDRESS=peer1-org1:7051-CORE_PEER_LOCALMSPID=org1MSP-CORE_PEER_TLS_ENABLED=true-CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem-CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/admin/mspworking_dir:/opt/gopath/src/github.com/hyperledger/fabric/org1command:shvolumes:-/tmp/hyperledger/org1/peer1:/tmp/hyperledger/org1/peer1-/tmp/hyperledger/org1/peer2:/tmp/hyperledger/org1/peer2-/Users/kctam/hf142/fabric-samples/chaincode:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode-/tmp/hyperledger/org1/admin:/tmp/hyperledger/org1/adminnetworks:-fabric-cacli-org2:container_name:cli-org2image:hyperledger/fabric-tools:1.4.2tty:truestdin_open:trueenvironment:-GOPATH=/opt/gopath-FABRIC_LOGGING_SPEC=INFO-CORE_PEER_ID=cli-CORE_PEER_ADDRESS=peer1-org2:7051-CORE_PEER_LOCALMSPID=org2MSP-CORE_PEER_TLS_ENABLED=true-CORE_PEER_TLS_ROOTCERT_FILE=/tmp/hyperledger/org2/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem-CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/admin/mspworking_dir:/opt/gopath/src/github.com/hyperledger/fabric/org2command:shvolumes:-/tmp/hyperledger/org2/peer1:/tmp/hyperledger/org2/peer1-/tmp/hyperledger/org2/peer2:/tmp/hyperledger/org2/peer2-/Users/kctam/hf142/fabric-samples/chaincode:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode-/tmp/hyperledger/org2/admin:/tmp/hyperledger/org2/adminnetworks:-fabric-ca

docker-compose.yaml

這是用於生成通道工件的配置(configtx.yaml)。

##################################################################################Section:Organizations##-Thispdefinesthedifferentorganizationalidentitieswhichwill#bereferencedlaterintheconfiguration.#################################################################################Organizations:-&org0Name:org0#IDtoloadtheMSPdefinitionasID:org0MSP#MSPDiristhefilesystempathwhichcontainstheMSPconfigurationMSPDir:/tmp/hyperledger/org0/msp-&org1Name:org1#IDtoloadtheMSPdefinitionasID:org1MSP#MSPDiristhefilesystempathwhichcontainstheMSPconfigurationMSPDir:/tmp/hyperledger/org1/mspAnchorPeers:#AnchorPeersdefinesthelocationofpeerswhichcanbeused#forcrossorggossipcommunication.Note,thisvalueisonly#encodedinthegenesisblockintheApplicationpcontext-Host:peer1-org1Port:7051-&org2Name:org2#IDtoloadtheMSPdefinitionasID:org2MSP#MSPDiristhefilesystempathwhichcontainstheMSPconfigurationMSPDir:/tmp/hyperledger/org2/mspAnchorPeers:#AnchorPeersdefinesthelocationofpeerswhichcanbeused#forcrossorggossipcommunication.Note,thisvalueisonly#encodedinthegenesisblockintheApplicationpcontext-Host:peer1-org2Port:7051##################################################################################SECTION:Application##Thispdefinesthevaluestoencodeintoaconfigtransactionor#genesisblockforapplicationrelatedparameters#################################################################################Application:&ApplicationDefaults#Organizationsisthelistoforgswhicharedefinedasparticipantson#theapplicationsideofthenetworkOrganizations:##################################################################################Profile##-Differentconfigurationprofilesmaybeencodedheretobespecified#asparameterstotheconfigtxgentool#################################################################################Profiles:OrgsOrdererGenesis:Orderer:#OrdererType:Theordererimplementationtostart#Availabletypesare"solo"and"kafka"OrdererType:soloAddresses:-orderer1-org0:7050#BatchTimeout:TheamountoftimetowaitbeforecreatingabatchBatchTimeout:2s#BatchSize:ControlsthenumberofmessagesbatchedintoablockBatchSize:#MaxMessageCount:ThemaximumnumberofmessagestopermitinabatchMaxMessageCount:10#AbsoluteMaxBytes:Theabsolutemaximumnumberofbytesallowedfor#theserializedmessagesinabatch.AbsoluteMaxBytes:99MB#PreferredMaxBytes:Thepreferredmaximumnumberofbytesallowedfor#theserializedmessagesinabatch.Amessagelargerthanthepreferred#maxbyteswillresultinabatchlargerthanpreferredmaxbytes.PreferredMaxBytes:512KB#Kafka:##Brokers:AlistofKafkabrokerstowhichtheordererconnects##NOTE:UseIP:portnotation#Brokers:#-127.0.0.1:9092#Organizationsisthelistoforgswhicharedefinedasparticipantson#theorderersideofthenetworkOrganizations:-*org0Consortiums:SampleConsortium:Organizations:-*org1-*org2OrgsChannel:Consortium:SampleConsortiumApplication:<<:*ApplicationDefaultsOrganizations:-*org1-*org2

目錄結構

我們建立/tmp/hyperledger以保留整個教程中生成的所有材料。我們正在本地主機中使用Fabric-CA-Client執行所有證書生成。結果全部儲存在/tmp/hyperledger的子目錄中。在課程中,我們將看到四個子目錄tls-ca,org0,org1,org2,並在教程中檢視目錄中的內容。

同時,目錄被用於兩個目的。

對映到網路元件

如果我們看一下網路元件(orderers或peers),我們將看到卷對映。以peer1-org1為例。

從卷中,我們可以看到在peer1-org1容器的/ tmp/hyperledger/org1/peer1中可以看到localhost的整個目錄/tmp/hyperledger/org1/peer1,該目錄中的那些材料將用作標識(MSP)和 TLS相關材料。

在其他網路元件中也可以看到類似的情況。

構成聯盟網路的配置

在我們的設定中,這三個組織正在形成一個聯盟網路。他們由其會員服務提供商(MSP)代表。我們來看一下配置檔案(摘錄)。

從configtx.yaml中提取,顯示結構網路中所有組織的MSP

因此,完成註冊後,我們將提供正確的證書以形成這些目錄/tmp/hyperledge/orgx/msp。在結構上有特定的要求,我們將在本教程中看到它們。

瞭解Fabric-CA-Server

由於本教程涉及很多Fabric CA Server,因此讓我們首先看一下內部的工作情況。

這裡我們以RCA-ORG1為例。RCA-ORG1的docker compose檔案是這樣的。

根據此設定,我們將學習

該Fabric-CA-Server的宿主對映到本地主機的/tmp/hyperledger/org1/ca/crypto。在教程中,我們很少進入容器。相反,我們可以檢查和引用來自本地主機的材料。

CA用載入程式憑證定義。在此CA中,它是rca-org1-admin:rca-org1-adminpw。當我們使用Fabric-CA-Client註冊管理員(註冊商)時,將使用此功能。

啟用了TLS。這樣在CA啟動並執行後,它將頒發TLS伺服器證書。它僅用於訪問此RCA-ORG1,不用於網路元件的TLS。請勿將其與TLS-CA混合使用,因為TLS-CA用於組織的網路元件的TLS伺服器證書。

現在我們開啟這個容器並進行觀察。

提起RCA-ORG1容器。

這是RCA-ORG1的插圖,具有我們所關注的那些組成部分。

觀察目錄結構(本地主機)。我們在我的本地主機中看到目錄/tmp/hyperledger/org1/ca/crypto,這是RCA-ORG1的Fabric-CA-Server的伺服器目錄。

出於我們的目的,我們首先在此目錄中找到兩個證書(ca-cert.pem和tls-cert.pem)。我們來看看每種證書的主題和頒發者。

證書ca-cert.pem是org1的身份根CA證書(在我們的圖中最上面的證書)。它是自簽名證書(頒發者=主題)。根CA頒發和簽名的所有證書(透過RCA的私鑰)都可以透過此證書進行驗證。

另一個證書tls-cert.pem由RCA頒發(請參閱頒發者)。這是我們圖中的底部。這是僅用於與此RCA進行TLS通訊的TLS伺服器證書。具體而言,當客戶端訪問RCA-ORG1時,RCA-ORG1將向客戶端提供此伺服器證書。客戶端將使用頒發者(即根CA證書)來驗證此伺服器證書,並確認客戶端正在與正確的伺服器(RCA-ORG1)通訊,並且客戶端與RCA-ORG1之間的通訊已加密。

我們還可以找到與這兩個證書相對應的私鑰(金鑰)。它們儲存在msp/keystore中。

我們在這裡看到兩個。透過快速檢查,我們知道哪個對應於哪個(方法是從私鑰中推匯出公鑰,並將其與證書中的公鑰進行比較)。

此私鑰(647e…)用於ca-cert.pem

這個私鑰(526e…)用於tls-cert.pem

最後,我們還看到一個資料庫(sqlite3)。該資料庫會跟蹤所有即將進行的實體註冊和註冊。請注意,載入程式ID和密碼也作為註冊實體放置在資料庫中。我們將看下一章教程中的展示該流程。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;