Playground for Hyperledger - 證書密鑰

上一章我們使用現(xiàn)有的腳本創(chuàng)建并運行了一個區(qū)塊鏈,但我們并不知道其背后運行的原理和方式,接下來我們從頭開始看看它都做了些什么。
首先把運行中的區(qū)塊鏈停止,并恢復原樣:

./byfn.sh -m down

crypto-config

首先,在一個區(qū)塊鏈創(chuàng)建之前,我們需要先生成對應各個節(jié)點的證書和密鑰,我們將使用cryptogen工具來生成各種網(wǎng)絡(luò)實體的加密材料(x509證書)。這些證書是身份的代表,它們允許在我們的網(wǎng)絡(luò)實體進行交流和交易時進行簽名/驗證身份驗證。

在first-network文件夾之下,有一個crypto-config.yaml文件,內(nèi)容如下:

OrdererOrgs:
  - Name: Orderer
    Domain: example.com
    Specs:
      - Hostname: orderer
PeerOrgs:
  - Name: Org1
    Domain: org1.example.comabove
    Template:
      Count: 2
    Users:
      Count: 1
  - Name: Org2
    Domain: org2.example.com
    Template:
      Count: 2
    Users:
      Count: 1

這里OrdererOrgs里面包含的是共識節(jié)點信息,配置文件中只配置了1個共識節(jié)點,就是orderer.example.com,如果我們要配置多個,那么需要改為:

OrdererOrgs:
  - Name: Orderer
    Domain: example.com
    Template:
      Count: 3

這里Count: 3表示的就是將有3個orderer節(jié)點,現(xiàn)在我們將其改為3個。

PeerOrgs表示的是組織的個數(shù),Template的Count表示組織中自動生成節(jié)點的個數(shù)。自動生成的節(jié)點將自動以peer0、peer1、peer2...這樣的命名方式命名。當然,也可以用Specs來指定節(jié)點的命名。Users的Count表示該組織中除了admin用戶,其他用戶的數(shù)量。

接下來我們將運行cryptogen工具,生成的證書和密鑰將被保存到名為crypto-config的文件夾中。

之前我們從https://goo.gl/byy2Qj 已經(jīng)下載了cryptogen工具,回到上級目錄,可以發(fā)現(xiàn)有個bin文件夾,文件夾中有我們需要的configtxgen可執(zhí)行文件,執(zhí)行命令:

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

可以看到在crypto-config文件夾中會多出ordererOrganizations和peerOrganizations兩個文件夾,里面分別又包含ca、msp、orderers、tlsca、users、peers等文件夾。

crypto-config文件夾中存放了所有節(jié)點所需的證書和密鑰

仔細分析,里面有很多重復的文件,應該是在生產(chǎn)部署的時候需要把不同的證書文件放到不同的節(jié)點中。例如:

Order-CA證書
ordererOrganizations/example.com/ca/ca.example.com-cert.pem
ordererOrganizations/example.com/msp/cacerts/ca.example.com-cert.pem
ordererOrganizations/example.com/orderers/ordererX.example.com/msp/cacerts/ca.example.com-cert.pem
ordererOrganizations/example.com/users/Admin@example.com/msp/cacerts/ca.example.com-cert.pem

Order-CA-TLS證書
ordererOrganizations/example.com/tlsca/tlsca.example.com-cert.pem
ordererOrganizations/example.com/msp/tlscacerts/tlsca.example.com-cert.pem
ordererOrganizations/example.com/orderers/ordererX.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
ordererOrganizations/example.com/orderers/ordererX.example.com/tls/ca.crt
ordererOrganizations/example.com/users/Admin@example.com/msp/tlscacerts/tlsca.example.com-cert.pem

Order-Admin用戶證書
ordererOrganizations/example.com/msp/admincerts/Admin@example.com-cert.pem
ordererOrganizations/example.com/orderers/ordererX.example.com/msp/admincerts/Admin@example.com-cert.pem
ordererOrganizations/example.com/users/Admin@example.com/msp/admincerts/Admin@example.com-cert.pem
ordererOrganizations/example.com/users/Admin@example.com/msp/signcerts/Admin@example.com-cert.pem

Org1證書
peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem
peerOrganizations/org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem
peerOrganizations/org1.example.com/peers/peerX.org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem
peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/cacerts/ca.org1.example.com-cert.pem

Org2證書
peerOrganizations/org2.example.com/ca/ca.org2.example.com-cert.pem
peerOrganizations/org2.example.com/msp/cacerts/ca.org2.example.com-cert.pem
peerOrganizations/org2.example.com/peers/peerX.org2.example.com/msp/cacerts/ca.org1.example.com-cert.pem
peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/cacerts/ca.org1.example.com-cert.pem

Org1-TLS證書
peerOrganizations/org1.example.com/tlsca/tlsca.org1.example.com-cert.pem
peerOrganizations/org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem
peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem

Org2-TLS證書
peerOrganizations/org2.example.com/tlsca/tlsca.org2.example.com-cert.pem
peerOrganizations/org2.example.com/msp/tlscacerts/tlsca.org2.example.com-cert.pem
peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/tlscacerts/tlsca.org1.example.com-cert.pem

Org1-Amin用戶證書
peerOrganizations/org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem
peerOrganizations/org1.example.com/peers/peerX.org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem
peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/admincerts/Admin@org1.example.com-cert.pem
peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem

其中ordererX表示order0、1、2都一樣,peerX表示peer0、1都一樣。其中還有一些單獨的文件:

 Order-CA的私鑰
ordererOrganizations/example.com/ca/xxxx_sk
 Order-CA-TLS的私鑰
ordererOrganizations/example.com/tlsca/xxxx_sk
 OrderX的私鑰
ordererOrganizations/example.com/orderers/ordererX.example.com/msp/keystore/xxxx_sk
OrderX的證書
ordererOrganizations/example.com/orderers/ordererX.example.com/msp/signcerts/ordererX.example.com-cert.pem
orderer admin用戶的私鑰
ordererOrganizations/example.com/users/Admin@example.com/msp/keystore/3e82a8d7b28d29673070cae73700d2a5bc2d3b2d17ef54e24b1e32a42c22a6f0_sk

Org1的私鑰
peerOrganizations/org1.example.com/ca/xxxx_sk
Org2的私鑰
peerOrganizations/org2.example.com/ca/xxxx_sk
Org1-TLS的私鑰
peerOrganizations/org1.example.com/tlsca/xxxx_sk
Org2-TLS的私鑰
peerOrganizations/org2.example.com/tlsca/xxxx_sk
Org1-Peer0的私鑰
peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/keystore/xxxx_sk
Org1-Peer0的證書
peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp/signcerts/peer0.org1.example.com-cert.pem
Org1-Admin的私鑰
peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/236cc791991aecf802e068fddb30806bedbcae6df1b5f7795778e666782d4306_sk

由此可見,Order有節(jié)點證書和用戶證書,根證書和私鑰放在ca文件夾,每個Order自己的證書和私鑰放在自己的ordererX.example.com目錄中。Org也有節(jié)點證書和用戶證書,根證書和私鑰放在ca文件夾,每個Peer自己的證書和私鑰放在自己的peerX.orgX.example.com目錄中。

當區(qū)塊鏈運行時,每個實體使用自己的私鑰對事件進行簽名,使用其他實體的證書(公鑰)來對其他實體簽名的內(nèi)容進行驗證。

configtx

接下來,我們需要使用configtxgen工具來生成區(qū)塊鏈的初始塊等基礎(chǔ)數(shù)據(jù),首先我們需要用到configtx.yaml文件:

Profiles:

    TwoOrgsOrdererGenesis:
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *OrdererOrg
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
    TwoOrgsChannel:
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2
Organizations:
    - &OrdererOrg
        Name: OrdererOrg
        ID: OrdererMSP
        MSPDir: crypto-config/ordererOrganizations/example.com/msp
    - &Org1
        Name: Org1MSP
        ID: Org1MSP

        MSPDir: crypto-config/peerOrganizations/org1.example.com/msp

        AnchorPeers:
            - Host: peer0.org1.example.com
              Port: 7051

    - &Org2
        Name: Org2MSP
        ID: Org2MSP

        MSPDir: crypto-config/peerOrganizations/org2.example.com/msp

        AnchorPeers:
            - Host: peer0.org2.example.com
              Port: 7051

Orderer: &OrdererDefaults
    # Available types are "solo" and "kafka"
    OrdererType: solo

    Addresses:
        - orderer.example.com:7050
    BatchTimeout: 2s
    BatchSize:
        MaxMessageCount: 10
        AbsoluteMaxBytes: 99 MB
        PreferredMaxBytes: 512 KB

    Kafka:
        Brokers:
            - 127.0.0.1:9092
    Organizations:

Application: &ApplicationDefaults

    Organizations:

Profiles模塊定義了我們的組織關(guān)系,TwoOrgsOrdererGenesis的信息會編碼到創(chuàng)世塊,TwoOrgsChannel的信息會編碼到channel配置交易文件中。
Organizations模塊定義了Order和每個Org的名字和MSP證書路徑,用于今后的驗證。MSP中的每個Org的根證書都會存儲到創(chuàng)世塊中,為以后使用。并且Org中還定義了AnchorPeers,AnchorPeers節(jié)點要求網(wǎng)絡(luò)能跨組織通信,這些信息都會被編碼在創(chuàng)世塊中。
接下來是Orderer模塊,OrdererType是共識算法,solo用于單節(jié)點共識,kafka用于paxos共識。BatchTimeout是生成區(qū)塊的最大時間間隔,BatchSize.MaxMessageCount是每個區(qū)塊能包含的交易數(shù)量,Kafka.Brokers定義了order節(jié)點所使用的kafka節(jié)點列表。
由于我們有3個Order節(jié)點,需要對Orderer模塊稍作修改:

    Addresses:
        - orderer0.example.com:7050
        - orderer1.example.com:7050
        - orderer2.example.com:7050

下面我們生成創(chuàng)世塊:

export FABRIC_CFG_PATH=$PWD
../bin/configtxgen -profile TwoOrgsOrdererGenesis -outputBlock ./channel-artifacts/genesis.block

channel-artifacts目錄下會多一個genesis.block文件。

再創(chuàng)建channel的配置交易文件,它用戶創(chuàng)建channel時廣播到所有Orderer節(jié)點:

export CHANNEL_NAME=mychannel
../bin/configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID $CHANNEL_NAME

為mychannel創(chuàng)建Org1、Org2的Anchor Peer節(jié)點所需的配置文件:

../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org1MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org1MSP
../bin/configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/Org2MSPanchors.tx -channelID $CHANNEL_NAME -asOrg Org2MSP

經(jīng)過上面的步驟,我們的channel-artifacts文件夾中就包含了channel.tx、genesis.block/Org1MSPanchors.tx、Org2MSPanchors.tx四個文件。

我們可以通過下面的命令來查看生產(chǎn)的塊和channel信息是否正確:

../bin/configtxgen -inspectBlock ./channel-artifacts/genesis.block
../bin/configtxgen -inspectChannelCreateTx ./channel-artifacts/channel.tx

我們上面做的所有事情,其實就等價于byfn.sh文件中的generateChannelArtifacts方法。

準備工作差不多了,下一章我們將開始啟動網(wǎng)絡(luò)~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容