1. 程式人生 > 實用技巧 >HyperLedger-Fabric原理-MSP詳解-Peer&Orderer配置MSP

HyperLedger-Fabric原理-MSP詳解-Peer&Orderer配置MSP

本文是MSP詳解的第二部分,我們通過第一部分對MSP有了初步的認識,下面我們來通過peer和order節點來對MSP做一個詳細的講解

本文會以下面的結構展開:

一,生成公私鑰和證書資訊

生成證書和公私鑰的過程

Fabric中有兩種型別的公私鑰和證書,一種是給節點之間,為了通訊安全而準備的TLS證書,另一種是使用者登入和許可權控制的使用者證書。這些證書本來應該是由CA來頒發,但是我們這裡是測試環境,並沒有啟用CA節點,這裡我們使用:cryptogen來生成這兩種證書。我們生成的公私鑰和證書是依據配置檔案crypto-config.yaml檔案來生成的。關於該檔案的詳細介紹,參見《HyperLedger-Fabric1.0原理-Fabric網路搭建過程之配置檔案》一文,這裡不再贅述。

1 cryptogen generate --config=./crypto-config.yaml

e2e_cli例子中,生成的的網路拓撲結構如下圖所示。

該命令會生成一個名為crypto-config的資料夾,該資料夾是基於Fabric網路的拓撲結構而來的:

二,目錄解析

生成的檔案都儲存到crypto-config資料夾,我們可以進入該資料夾檢視生成了哪些檔案:

檢視當前目錄下的crypto-config目錄,生成ordererOrganizations和peerOrganizations兩棵組織樹。

以peerOrganizations為例,該目錄下有兩個目錄org1.example.com和org2.example.com。分別對應通道中Org1和Org2的相關證書和簽名。

每個組織樹下都包括ca、msp、orderers(或peers)、tlsca、users五個子目錄。

org1.example.com表示Org1組織。

在peers目錄下,有兩個子目錄peer0.org1.example.com和peer1.org1.example.com包含了這兩個節點的msp配置資訊。

接下來以org1.example.com組織樹為例,每個目錄和檔案對應的功能講解。

org1.example.com/
├── ca     # 存放組織Org1的根證書和對應的私鑰檔案,預設採用EC演算法,證書為自簽名。組織內的實體將基於該根證書作為證書根。
│   ├── ca.org1.example.com
-cert.pem │ └── dfb841b77804d726eea25231ae5e89a31901ca0538688a6d764731148f0bdc5b_sk ├── msp # 存放代表該組織的身份資訊。 │ ├── admincerts # 組織管理員的身份驗證證書,被根證書籤名。 │ │ └── [email protected]-cert.pem │ ├── cacerts # 組織的根證書,同ca目錄下檔案。 │ │ └── ca.org1.example.com-cert.pem │ └── tlscacerts # 用於TLS的CA證書,自簽名。 │ └── tlsca.org1.example.com-cert.pem ├── peers # 存放屬於該組織的所有Peer節點 │ ├── peer0.org1.example.com # 第一個peer的資訊,包括其msp證書和tls證書兩類。 │ │ ├── msp # msp相關證書 │ │ │ ├── admincerts # 組織管理員的身份驗證證書。Peer將基於這些證書來認證交易簽署者是否為管理員身份。 │ │ │ │ └── [email protected]-cert.pem │ │ │ ├── cacerts # 存放組織的根證書 │ │ │ │ └── ca.org1.example.com-cert.pem │ │ │ ├── keystore # 本節點的身份私鑰,用來簽名 │ │ │ │ └── 59be216646c0fb18c015c58d27bf40c3845907849b1f0671562041b8fd6e0da2_sk │ │ │ ├── signcerts # 驗證本節點簽名的證書,被組織根證書籤名 │ │ │ │ └── peer0.org1.example.com-cert.pem │ │ │ └── tlscacerts # TLS連線用到身份證書,即組織TLS證書 │ │ │ └── tlsca.org1.example.com-cert.pem │ │ └── tls # tls相關證書 │ │ ├── ca.crt # 組織的根證書 │ │ ├── server.crt # 驗證本節點簽名的證書,被組織根證書籤名 │ │ └── server.key # 本節點的身份私鑰,用來簽名 │ └── peer1.org1.example.com # 第二個peer的資訊,結構類似。(此處省略。) │ ├── msp │ │ ├── admincerts │ │ │ └── [email protected]-cert.pem │ │ ├── cacerts │ │ │ └── ca.org1.example.com-cert.pem │ │ ├── keystore │ │ │ └── 82aa3f8f9178b0a83a14fdb1a4e1f944e63b72de8df1baeea36dddf1fe110800_sk │ │ ├── signcerts │ │ │ └── peer1.org1.example.com-cert.pem │ │ └── tlscacerts │ │ └── tlsca.org1.example.com-cert.pem │ └── tls │ ├── ca.crt │ ├── server.crt │ └── server.key ├── tlsca # 存放tls相關的證書和私鑰。 │ ├── 00e4666e5f56804274aadb07e2192db2f005a05f2f8fcfd8a1433bdb8ee6e3cf_sk │ └── tlsca.org1.example.com-cert.pem └── users # 存放屬於該組織的使用者的實體 ├── [email protected] # 管理員使用者的資訊,其中包括msp證書和tls證書兩類。 │ ├── msp # msp相關證書 │ │ ├── admincerts # 組織根證書作為管理員身份驗證證書 │ │ │ └── [email protected]-cert.pem │ │ ├── cacerts # 存放組織的根證書 │ │ │ └── ca.org1.example.com-cert.pem │ │ ├── keystore # 本使用者的身份私鑰,用來簽名 │ │ │ └── fa719a7d19e7b04baebbe4fa3c659a91961a084f5e7b1020670be6adc6713aa7_sk │ │ ├── signcerts # 管理員使用者的身份驗證證書,被組織根證書籤名。要被某個Peer認可,則必須放到該Peer的msp/admincerts目錄下 │ │ │ └── [email protected]-cert.pem │ │ └── tlscacerts # TLS連線用的身份證書,即組織TLS證書 │ │ └── tlsca.org1.example.com-cert.pem │ └── tls # 存放tls相關的證書和私鑰。 │ ├── ca.crt # 組織的根證書 │ ├── server.crt # 管理員的使用者身份驗證證書,被組織根證書籤名 │ └── server.key # 管理員使用者的身份私鑰,被組織根證書籤名。 └── [email protected] # 第一個使用者的資訊,包括msp證書和tls證書兩類 ├── msp # msp證書相關資訊 │ ├── admincerts # 組織根證書作為管理者身份驗證證書。 │ │ └── [email protected]-cert.pem │ ├── cacerts # 存放組織的根證書 │ │ └── ca.org1.example.com-cert.pem │ ├── keystore # 本使用者的身份私鑰,用來簽名 │ │ └── 97f2b74ee080b9bf417a4060bfb737ce08bf33d0287cb3eef9b5be9707e3c3ed_sk │ ├── signcerts # 驗證本使用者簽名的身份證書,被組織根證書籤名 │ │ └── [email protected]-cert.pem │ └── tlscacerts # TLS連線用的身份證書,被組織根證書籤名。 │ └── tlsca.org1.example.com-cert.pem └── tls # 組織的根證書 ├── ca.crt # 組織的根證書 ├── server.crt # 驗證使用者簽名的身份證書,被根組織證書籤名 └── server.key # 使用者的身份私鑰用來簽名。

上面目錄結構中的所有檔案,就是我們用cryptogen工具來生成的MSP需要用到的證書和相關檔案。主要包括各種證書和相關的簽名。

三,Peer&Orderer配置MSP

在上面,使用工具已經為我們生成了相關的目錄和對應的檔案。如果沒有工具,需要我們手動建立目錄,以及手動配置MSP,該怎麼做呢?

主要分成兩步:

第一步:

在peer / orderer 對應的目錄下,建立幾個子資料夾,放入對應的證書,簽名等相關資訊。

第二步:

在Peer/orderer的配置檔案中,設定證書和簽名的路徑。

節點的配置檔案如下:(peer對應的是core.yaml檔案 , orderer對應的是orderer.yaml)。

配置過程介紹

第一步詳細過程

要想(為peer節點或orderer節點)建立本地MSP,管理員應建立一個資料夾(如$MY_PATH/mspconfig)並在其下包含6個子資料夾與一個檔案:

  1. 資料夾admincerts包含PEM檔案:每個PEM檔案對應於一個管理員證書。
  2. 資料夾cacerts包含PEM檔案:每個PEM檔案對應於一個根CA的證書。
  3. 一個資料夾signcerts包含節點的X.509證書的PEM檔案。
  4. (可選)資料夾intermediatecerts包含一些PEM檔案:每個PEM檔案對應於一箇中間CA的證書。
  5. (可選)一個資料夾,tlscacerts以包含每個對應於TLS根CA證書的PEM檔案
  6. (可選)資料夾crls包含相關CRL。
  7. 資料夾keystore包含一個PEM檔案及節點的簽名金鑰;我們必須強調:現階段還不支援RSA金鑰。
  8. (可選)資料夾tlscacerts包含如下PEM檔案:每個PEM檔案對應於一個根TLS根CA的證書
  9. (可選)資料夾tlsintermediatecerts包含如下PEM檔案:每個PEM檔案對應於一箇中間TLS CA的證書

在e2e_cli中,該Org1組織中的有兩個節點,一個是管理員peer0,另一個是使用者peer1。

這兩個節點的檔案路徑如下:

peers資料夾下有兩個檔案,分別他們是peer0和peer1的本地MSP配置檔案所在:

進入peer0.org1.example.com資料夾下,可以看到如下兩個資料夾

此時,檔案的當前目錄為:

該目錄即為peer0.org1節點進行msp配置的檔案目錄。

一般情況,存放msp配置的相關資訊的資料夾可以命名為mspconfig 或者 msp。

其中,msp的檔案目錄結構如下所示:

這五個資料夾下分別放了Peer0節點完成證書與簽名認證所需要的相關檔案。

至此,完成了Peer&Orderer配置MSP的第一步了。

第二步詳細過程

第一步的主要目的,是準備相關的證書和簽名。第二步,就是要將這些檔案路徑配置到Peer | Orderer的配置檔案中。這樣,在啟動節點時,就能夠找到相應的證書和簽名進行認證。

在節點的配置檔案中,

peer對應的是core.yaml檔案;

orderer對應的是orderer.yaml。

我們需要在這些配置檔案中指定mspconfig資料夾的路徑和節點MSP的MSP識別符號。

那麼到底如何來指定呢?

下面將逐一講解:

1>peer節點配置

當Peer節點作為服務端啟動時,會按照優先順序從高到低的順序依次嘗試從命令列引數、環境變數或配置檔案中讀取配置資訊。這裡,我們主要通過配置檔案的方式來對Peer進行配置。

讀取配置資訊的順序

  1. Peer節點預設的配置檔案讀取路徑為$FABRIC_CFG_PATH/core.yaml;
  2. 如果沒找到,則嘗試查詢當前目錄下的./core.yaml檔案;
  3. 如果還沒有找到,則嘗試查詢預設的/etc/hyperledger/fabric/core.yaml檔案。

在結構上,core.yaml檔案中一般包括logging、peer、vm、chaincode、ledger五大部分,其中,與MSP配置相關的主要是peer部分。下面見介紹如何對Peer部分進行配置,實現MSP。

peer部分包括了許多跟服務直接相關的核心配置,內容也比較多,包括msp配置、gossip、events、tls等多個配置部分,如下圖所示:

下面將著重介紹通用配置中的MSP配置:

開啟core.yaml檔案,以下部分是關於MSP的配置

配置------>·mspConfigPath:

MSP目錄所在的路徑,可以為絕對路徑,或相對配置目錄的路徑,一般建議為/etc/hyperledger/fabric/msp;本例中,寫的是相對路徑msp

配置------->localMspId:

Peer所關聯的MSP的ID,一般為組織單位名稱,需要與聯盟配置中的名稱一致;

到這裡,就已經完成了對Peer節點的LocalMSP配置。

2>Orderer節點配置

orderer節點對應的配置檔案是orderer.yaml。

Orderer節點可以組成叢集來在Fabric網路中提供排序服務。類似地,支援從命令列引數、環境變數或配置檔案中讀取配置資訊。

當從環境變數中讀入配置時,需要以ORDERER_字首開頭,例如配置檔案中的general.ListenAddress項,對應到環境變數ORDERER_GENERAL_LISTENADDRESS。

在結構上,orderer.yaml檔案中一般包括General、FileLedger、RAMLedger、Kafka四大部分,其中,涉及MSP配置的部分在General。General部分的配置如下所示:

其中,LocalMSPDir,LocalMSPID為配置本地msp的主要部分。進入該orderer.yaml檔案,該部分如下圖所示:

配置------>LocalMSPDir:

MSP目錄所在的路徑,可以為絕對路徑或相對路徑,一般建議為$FABRIC_CFG_PATH/msp;

配置------>localMspId:

Orderer所關聯的MSP的ID,需要與聯盟配置中的組織的MSP名稱一致;

到這裡,就已經完成了對Orderer節點的LocalMSP配置。

四、總結

在這一篇文章中,我們發現Fabric的配置是一門很大的學問。這裡,對msp的實現,就是通過配置檔案來實現的。

我們通過相關工具,生成了系統中所需要的證書和簽名等。

這一部分涉及crypro-config.yaml檔案。

利用該配置檔案,我們可以定義網路拓撲,以及生成相關證書。

生成MSP相關證書和檔案後,我們對Peer和Orderer進行了MSP配置。這一部分也是通過配置檔案來實現的。

core.yaml 是Peer節點的配置檔案,通過對Peer部分的mspConfigPath和localMspId欄位,來完成msp配置。

Orderer.yaml是Orderer節點的配置檔案,通過對General部分的LocalMSPDir和localMspId欄位,來完成msp配置。

到目前為止,我們瞭解了MSP的基本組成,基本功能,以及對Peer&Orderer節點的配置。

總結下來,MSP的peer&Orderer節點配置就是,在每一個Peer節點和排序服務節點上設定MSP目錄,放入相關的證書和簽名公私鑰,然後在對應的配置檔案中,設定msp檔案路徑。Peer節點和排序服務節點就有了簽名證書,在通道節點之間傳輸資料時,要驗證節點的簽名,從而實現證書的驗證和簽名。

org1.example.com/
├── ca     # 存放組織Org1的根證書和對應的私鑰檔案預設採用EC演算法證書為自簽名組織內的實體將基於該根證書作為證書根
   ├── ca.org1.example.com-cert.pem
   └── dfb841b77804d726eea25231ae5e89a31901ca0538688a6d764731148f0bdc5b_sk
├── msp    # 存放代表該組織的身份資訊
   ├── admincerts         # 組織管理員的身份驗證證書被根證書籤名
      └── Admin@org1.example.com-cert.pem
   ├── cacerts # 組織的根證書同ca目錄下檔案
      └── ca.org1.example.com-cert.pem
   └── tlscacerts          # 用於TLS的CA證書自簽名
       └── tlsca.org1.example.com-cert.pem
├── peers   # 存放屬於該組織的所有Peer節點
   ├── peer0.org1.example.com    # 第一個peer的資訊包括其msp證書和tls證書兩類
      ├── msp # msp相關證書   
         ├── admincerts  # 組織管理員的身份驗證證書Peer將基於這些證書來認證交易簽署者是否為管理員身份
            └── Admin@org1.example.com-cert.pem
         ├── cacerts     # 存放組織的根證書
            └── ca.org1.example.com-cert.pem
         ├── keystore    # 本節點的身份私鑰用來簽名
            └── 59be216646c0fb18c015c58d27bf40c3845907849b1f0671562041b8fd6e0da2_sk
         ├── signcerts   # 驗證本節點簽名的證書被組織根證書籤名 
            └── peer0.org1.example.com-cert.pem
         └── tlscacerts  # TLS連線用到身份證書即組織TLS證書
             └── tlsca.org1.example.com-cert.pem
      └── tls # tls相關證書
          ├── ca.crt      # 組織的根證書
          ├── server.crt  # 驗證本節點簽名的證書被組織根證書籤名
          └── server.key  # 本節點的身份私鑰用來簽名
   └── peer1.org1.example.com    # 第二個peer的資訊結構類似。(此處省略。)
       ├── msp
          ├── admincerts
             └── Admin@org1.example.com-cert.pem
          ├── cacerts
             └── ca.org1.example.com-cert.pem
          ├── keystore
             └── 82aa3f8f9178b0a83a14fdb1a4e1f944e63b72de8df1baeea36dddf1fe110800_sk
          ├── signcerts
             └── peer1.org1.example.com-cert.pem
          └── tlscacerts
              └── tlsca.org1.example.com-cert.pem
       └── tls
           ├── ca.crt
           ├── server.crt
           └── server.key
├── tlsca    # 存放tls相關的證書和私鑰
   ├── 00e4666e5f56804274aadb07e2192db2f005a05f2f8fcfd8a1433bdb8ee6e3cf_sk
   └── tlsca.org1.example.com-cert.pem
└── users    # 存放屬於該組織的使用者的實體
    ├── Admin@org1.example.com    # 管理員使用者的資訊其中包括msp證書和tls證書兩類
       ├── msp # msp相關證書
          ├── admincerts     # 組織根證書作為管理員身份驗證證書 
             └── Admin@org1.example.com-cert.pem
          ├── cacerts        # 存放組織的根證書
             └── ca.org1.example.com-cert.pem
          ├── keystore       # 本使用者的身份私鑰用來簽名
             └── fa719a7d19e7b04baebbe4fa3c659a91961a084f5e7b1020670be6adc6713aa7_sk
          ├── signcerts      # 管理員使用者的身份驗證證書被組織根證書籤名要被某個Peer認可則必須放到該Peer的msp/admincerts目錄下
             └── Admin@org1.example.com-cert.pem
          └── tlscacerts     # TLS連線用的身份證書即組織TLS證書
              └── tlsca.org1.example.com-cert.pem
       └── tls # 存放tls相關的證書和私鑰
           ├── ca.crt       # 組織的根證書
           ├── server.crt   # 管理員的使用者身份驗證證書被組織根證書籤名
           └── server.key   # 管理員使用者的身份私鑰被組織根證書籤名
    └── User1@org1.example.com    # 第一個使用者的資訊包括msp證書和tls證書兩類
        ├── msp # msp證書相關資訊
           ├── admincerts   # 組織根證書作為管理者身份驗證證書
              └── User1@org1.example.com-cert.pem
           ├── cacerts      # 存放組織的根證書
              └── ca.org1.example.com-cert.pem
           ├── keystore     # 本使用者的身份私鑰用來簽名
              └── 97f2b74ee080b9bf417a4060bfb737ce08bf33d0287cb3eef9b5be9707e3c3ed_sk
           ├── signcerts    # 驗證本使用者簽名的身份證書被組織根證書籤名
              └── User1@org1.example.com-cert.pem
           └── tlscacerts   # TLS連線用的身份證書被組織根證書籤名
               └── tlsca.org1.example.com-cert.pem
        └── tls # 組織的根證書
            ├── ca.crt       # 組織的根證書
            ├── server.crt   # 驗證使用者簽名的身份證書被根組織證書籤名
            └── server.key   # 使用者的身份私鑰用來簽名