Fabric CA 操作指南

273 阅读15分钟

本文将介绍如何使用Fabric CA构建一个Fabric网络,所有的构建fabric区块链网络的身份必须都要授权。该授权以加密材料的形式提供,这些材料是针对可信任当局验证的。

在本指南中,您将看到设置包含两个组织的区块链的过程,每个网络都有两个peer节点和一个orderer节点。您将了解如何为orders节点,peers节点,administrators和end users生成加密材料,以便私钥永远不会留在生成他们的主机或容器上。

拓扑

在此示例中,我们将研究如何在三个组织中设置order,peer和CAs。可以在下面的图像中看到此部署的拓扑:

image.png

此示例将使用Docker容器模拟部署。容器将被视为在不同的主机上运行。这是这样做的,因此您可以看到在网络中涉及的各方之间边界需要交换哪些资产。

Docker的网络配置假定所有容器都在同一网络中运行。如果您的部署跨越不同的网络,则需要调整该示例以与您的网络配置一起使用。

设置CA

对于需要获取加密材料的每个主机,您需要在主机上使用Fabric-CA-Client二进制文件。客户端将用于连接到Fabric CA Server容器。

设置TLS CA

TLS CA用于发出TLS证书。需要这些证书以确保各种过程之间的通信。为了简化此示例,所有组织将使用相同的TLS CA,并且禁用TLS相互身份验证。

Docker服务,例如下面的可用于启动Fabric TLS CA容器。

ca-tls:
  container_name: ca-tls
  image: hyperledger/fabric-ca
  command: sh -c 'fabric-ca-server start -d -b tls-ca-admin:tls-ca-adminpw --port 7052'
  environment:
    - FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto
    - FABRIC_CA_SERVER_TLS_ENABLED=true
    - FABRIC_CA_SERVER_CSR_CN=ca-tls
    - FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
    - FABRIC_CA_SERVER_DEBUG=true
  volumes:
    - /tmp/hyperledger/tls/ca:/tmp/hyperledger/fabric-ca
  networks:
    - fabric-ca
  ports:
    - 7052:7052

可以使用以下Docker命令启动此容器。

docker-compose up ca-tls

在成功启动容器时,您将在CA容器的日志中看到以下行。

[INFO] Listening on https://0.0.0.0:7052

此时,TLS CA服务器位于安全套接字上的侦听,并且可以开始发出TLS证书。

登记 TLS CA's Admin

在开始使用CA客户端之前,必须获取CA的TLS证书的签名证书。在使用TLS连接之前,这是必要步骤。

在我们的示例中,您需要在运行TLS CA Server的机器上获取位于/tmp/hyperledger/tls-ca/crypto/ca-cert.pem的文件并将此文件复制到您将运行的主机上CA客户端二进制。此证书,也称为TLS CA的签名证书将用于验证CA的TLS证书。一旦证书复制到CA客户端的主机,您就可以使用CA开始发出命令。

TLS CA的签名证书需要在每个将运行针对TLS CA的命令的主机上可用。

TLS CA Server以Bootstrap Identity启动,他具有服务器的完整管理权限。管理员的一个关键能力是注册新身份的能力。此CA的管理员将使用Fabric CA客户端与CA注册四个新身份标识,每个peer一个和一个orderer.这些身份将用于获得peer和orderer的TLS证书。

您将发出以下命令以注册TLS CA Admin,然后注册标识。我们假定你已经将对于TLS CA授信的根证书复制到所有需要使用它通过fabric-ca-client进行通信的主机上面的/tmp/hyperledger/tls-ca/crypto/tls-ca-cert.pem

export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/tls-ca/crypto/tls-ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/tls-ca/admin
fabric-ca-client enroll -d -u https://tls-ca-admin:tls-ca-adminpw@0.0.0.0:7052
fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer2-org1 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer1-org2 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer2-org2 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name orderer1-org0 --id.secret ordererPW --id.type orderer -u https://0.0.0.0:7052

完成上面的步骤之后,我们就可以继续设置每个组织的网络,随时我们需要获取组织中节点的TLS证书,我们将参考此CA.

设置Oderer Org CA

每个组织必须有自己的证书颁发机构(CA),用于发出登记证书。CA将为组织中的每个peer和客户端发出证书。您的CA创建属于您的组织的身份并发出每个身份公钥和私钥。这些键是允许所有节点和应用程序签名和验证其操作。您的CA签名的任何身份将被网络的其他成员理解,以识别属于您组织的组件。

ORG0的管理员将启动Fabric CA Docker容器,该容器将由ORG0使用,以向ORG0中的身份发出加密材料。诸如下面的Docker服务可用于启动Fabric CA容器。

rca-org0:
   container_name: rca-org0
   image: hyperledger/fabric-ca
   command: /bin/bash -c 'fabric-ca-server start -d -b rca-org0-admin:rca-org0-adminpw --port 7053'
   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=true
   volumes:
      - /tmp/hyperledger/org0/ca:/tmp/hyperledger/fabric-ca
   networks:
      - fabric-ca
   ports:
      - 7053:7053

在成功启动容器时,您将在CA容器的日志中看到以下行。

[INFO] Listening on https://0.0.0.0:7053

此时CA Server正在侦听安全套接字,并且可以开始发出加密材料。

登记orderer Org's CA Admin

您将发出以下命令以注册CA Admin,然后注册两个ORG0的身份。

下面的命令,我们将假设已经将授信的CA TLS根证书复制到fabric-ca-client可执行二进制文件存在的主机的/tmp/hyperledger/org0/ca/crypto/ca-cert.pem.如果客户二进制文件位于其他主机上,则需要通过带外进程获取签名证书。 下列身份将注册:

  • Orderer (orderer1-org0)
  • Orderer admin (admin-org0)
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/ca/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/ca/admin
fabric-ca-client enroll -d -u https://rca-org0-admin:rca-org0-adminpw@0.0.0.0:7053
fabric-ca-client register -d --id.name orderer1-org0 --id.secret ordererpw --id.type orderer -u https://0.0.0.0:7053
fabric-ca-client register -d --id.name admin-org0 --id.secret org0adminpw --id.type admin --id.attrs "hf.Registrar.Roles=client,hf.Registrar.Attributes=*,hf.Revoker=true,hf.GenCRL=true,admin=true:ecert,abac.init=true:ecert" -u https://0.0.0.0:7053

您上面执行的注册命令将填充/tmp/hyperledger/org0/ca/admin目录,并通过发布的加密材料形成CA.您将看到以下文件,如下所示:

admin
├── fabric-ca-client-config.yaml
└── msp
   ├── IssuerPublicKey
   ├── IssuerRevocationPublicKey
   ├── cacerts
   │   └── 0-0-0-0-7053.pem
   ├── keystore
   │   └── 60b6a16b8b5ba3fc3113c522cce86a724d7eb92d6c3961cfd9afbd27bf11c37f_sk
   ├── signcerts
   │   └── cert.pem
   └── user

fabric-ca-client-config.yaml是CA客户端生成的文件,此文件包含CA客户端的配置。有三个其他重要文件要注意。第一个是0-0-0-0-0-7053.PEM,这是CA发布了此身份的证书的公共证书。第二个是60b6a16b8b5ba3fc3113c522cce86a724d7eb92d6c3961cfd9afbd27bf11c37f_sk文件,这个文件是由客户端产生的私钥,这个文件的名字是一个变量的值,任何时候产生的都是不一样的。最后一个是cert.pem文件,这个文件是由CA产生并签名的证书。

设置Org1's CA

对ORG0执行的相同组步骤适用于ORG1的CA.

ORG1的管理员将启动Fabric CA Docker容器,该容器将由ORG1使用,以发出ORG1中的身份的加密材料。Docker服务,例如下面可用于启动Fabric CA容器。

rca-org1:
   container_name: rca-org1
   image: hyperledger/fabric-ca
   command: /bin/bash -c 'fabric-ca-server start -d -b rca-org1-admin:rca-org1-adminpw'
   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=true
   volumes:
      - /tmp/hyperledger/org1/ca:/tmp/hyperledger/fabric-ca
   networks:
      - fabric-ca
   ports:
      - 7054:7054

在成功启动容器时,您将在CA容器的日志中看到以下行。

[INFO] Listening on https://0.0.0.0:7054

此时CA Server正在侦听安全套接字,并且可以开始发出加密材料。

登记Org1's CA Admin

您将发出以下命令以注册CA Admin,然后注册ORG1的身份。

正在注册以下身份:

  • Peer1 (peer1-org1)
  • Peer2 (peer2-org1)
  • Admin (admin1-org1)
  • End user(user-org1)

在下面的命令,我们假定你已经吧授信的根证书复制到fabric-ca-client存在的主机上的/tmp/hyperledger/org1/ca/crypto/ca-cert.pem.

export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/ca/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/ca/admin
fabric-ca-client enroll -d -u https://rca-org1-admin:rca-org1-adminpw@0.0.0.0:7054
fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name peer2-org1 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name admin-org1 --id.secret org1AdminPW --id.type user -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name user-org1 --id.secret org1UserPW --id.type user -u https://0.0.0.0:7054

设置 Org2's CA

rca-org2:
  container_name: rca-org2
  image: hyperledger/fabric-ca
  command: /bin/bash -c 'fabric-ca-server start -d -b rca-org2-admin:rca-org2-adminpw --port 7055'
  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=true
  volumes:
    - /tmp/hyperledger/org2/ca:/tmp/hyperledger/fabric-ca
  networks:
    - fabric-ca
  ports:
    - 7055:7055

启动成功,会在日志中看到

[INFO] Listening on https://0.0.0.0:7055

此时CA Server正在侦听安全套接字,并且可以开始发出加密材料。

登记Org2's CA Admin

export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/ca/crypto/ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org2/ca/admin
fabric-ca-client enroll -d -u https://rca-org2-admin:rca-org2-adminpw@0.0.0.0:7055
fabric-ca-client register -d --id.name peer1-org2 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7055
fabric-ca-client register -d --id.name peer2-org2 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7055
fabric-ca-client register -d --id.name admin-org2 --id.secret org2AdminPW --id.type user -u https://0.0.0.0:7055
fabric-ca-client register -d --id.name user-org2 --id.secret org2UserPW --id.type user -u https://0.0.0.0:7055

设置 Peers

一旦CAs启动并运行,我们可以启动登记peer节点

设置Org1's Peers

ORG1的管理员将使用其CA注册peer, 然后启动peer的Docker容器。在启动peer之前,您需要使用CA注册peer标识以获取peer将使用的MSP。这称为本地对等MSP。

登记Peer1

如果运行Peer1的主机上没有fabric-ca-client二进制运行文件,你需要从github.com 下载。下面的命令,我们假设你已经将Org1的授信根证书复制到Peer1主机的/tmp/hyperledger/org1/peer1/assets/ca/org1-ca-cert.pem.

export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/peer1
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/ca/org1-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://peer1-org1:peer1PW@0.0.0.0:7054

下一步是获得peer的TLS加密材料。这需要另外注册,但这一次您将注册TLS CA上的TLS配置文件。您还需要在注册请求中提供Peer1的主机的地址作为csr.hosts标志的输入。下面的命令,我们假定你已经将TLS CA证书复制到Peer1主机的/tmp/hyperledger/org1/peer1/assets/tls-ca/tls-ca-cert.pem

export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/tls-ca/tls-ca-cert.pem
fabric-ca-client enroll -d -u https://peer1-org1:peer1PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer1-org1

/tmp/hyperledger/org1/peer1/tls-msp/keystore目录下将key的名称改为key.pem.这将使能够在以后的步骤中易于参考。

此时,您将拥有两个MSP目录。一个MSP包含peer的注册证书,另一个具有peer的TLS证书。一旦admin注册,您会将admincerts文件夹添加到注册MSP。

登记Org1's Admin

此时,两个peer都已注册。现在,您将注册ORG1的管理员身份。管理员身份负责安装和实例化链码等活动。以下步骤将注册管理员。在下面的命令中,我们将假设它们正在PEER1的主机上执行。

export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/ca/org1-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://admin-org1:org1AdminPW@0.0.0.0:7054

在注册后,您应该拥有一个管理员msp。您将从此MSP中复制证书,并将其移动到Peer1的MSP的admincerts文件夹中。您需要将此管理证书传播到ORG中的其他peer,并且需要进入每个peer的MSP的admincerts文件夹。

以下命令仅适用于PEER1,

mkdir /tmp/hyperledger/org1/peer1/msp/admincerts
cp /tmp/hyperledger/org1/admin/msp/signcerts/cert.pem /tmp/hyperledger/org1/peer1/msp/admincerts/org1-admin-cert.pem

如果peer的本地MSP缺少admincerts文件夹,则peer将无法启动。

启动Org1's Peer节点

一旦我们注册了所有peer和org管理员,我们已经有了必要的MSP然后开始启动peer。

例如下面可用于启动PEER1的容器。

peer1-org1:
  container_name: peer1-org1
  image: hyperledger/fabric-peer
  environment:
    - 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=debug
    - 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=true
  working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org1/peer1
  volumes:
    - /var/run:/host/var/run
    - /tmp/hyperledger/org1/peer1:/tmp/hyperledger/org1/peer1
  networks:
    - fabric-ca

启动peer服务将打开peer容器,并在日志中看到以下行:

serve -> INFO 020 Started peer with ID=[name:"peer1-org1" ], network ID=[dev], address=[peer1-org1:7051]

如下面的那个可用于启动PEER2的容器。

peer2-org1:
  container_name: peer2-org1
  image: hyperledger/fabric-peer
  environment:
    - 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=grpc=debug: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:7051
  working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org1/peer2
  volumes:
    - /var/run:/host/var/run
    - /tmp/hyperledger/org1/peer2:/tmp/hyperledger/org1/peer2
  networks:
    - fabric-ca

启动后,在日志中看到以下行:

serve -> INFO 020 Started peer with ID=[name:"peer2-org1" ], network ID=[dev], address=[peer2-org1:7051]

Org2的Peer节点和上面一样的流程

设置Orderer

我们需要设置的最后一件事是orderer。在我们启动orderer之前,我们需要采取几个行动。

登记Orderer

在启动orderer之前,您需要使用CA注册orderer的身份,以获取orderer将使用的MSP。这称为本地授权MSP。

如果主机没有Fabric-CA-Client二进制文件,请参阅上面的说明下载二进制文件。

您将发出以下命令以获取注册的orderer。在下面的命令中,我们将假设可访问的ORG0的根证书在orderer主机的/tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem

export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/orderer
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
fabric-ca-client enroll -d -u https://orderer1-org0:ordererpw@0.0.0.0:7053

接下来,您将获得TLS证书。在下面的命令中,我们将假设已复制TLS CA的证书在orderer主机的 /tmp/hyperledger/org0/orderer/assets/tls-ca/tls-ca-cert.pem

export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/tls-ca/tls-ca-cert.pem
fabric-ca-client enroll -d -u https://orderer1-org0:ordererPW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts orderer1-org0

进到目录/tmp/hyperledger/org0/orderer/tls-msp/keystore修改key的名称为key.pem.

此时,您将拥有两个MSP目录。一个MSP包含您的注册证书,另一个MSP包含您的TLS证书。但是,在注册MSP目录中添加了一个附加文件夹,这是admincerts文件夹。此文件夹将包含peer1的管理员的证书。现在,您将通过发出下面的命令来注册ORG0的管理员身份。

登记Org0's Admin

下面的命令假定在Orderer的主机上正在执行此操作。

export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://admin-org0:org0adminpw@0.0.0.0:7053

注册后,您应该有一个MSP文件夹/tmp/hyperledger/org0/admin您将从此MSP中复制证书并将其移动到Orderer的MSP在admincerts目录

mkdir /tmp/hyperledger/org0/orderer/msp/admincerts
cp /tmp/hyperledger/org0/admin/msp/signcerts/cert.pem /tmp/hyperledger/org0/orderer/msp/admincerts/orderer-admin-cert.pem

创建创世区块和通道交易

orderer需要一个创世区块来启动他自己,下面的内容,你将看到configtx.yaml的一部分。全部的内容可以在这里查看

在orderer主机上,我们需要收集所有组织的MSP文件。configtx.yaml配置文件的organization部分如下:

Organizations:

- &org0

   Name: org0

   ID: org0MSP

   MSPDir: /tmp/hyperledger/org0/msp

- &org1

   Name: org1

   ID: org1MSP

   MSPDir: /tmp/hyperledger/org1/msp

   AnchorPeers:
      - Host: peer1-org1
         Port: 7051

- &org2

   Name: org2

   ID: org2MSP

   MSPDir: /tmp/hyperledger/org2/msp

   AnchorPeers:
      - Host: peer1-org2
        Port: 7051

Org0的MSP目录结构如下:

/tmp/hyperledger/org0/msp
├── admincerts
│   └── admin-org0-cert.pem
├── cacerts
│   └── org0-ca-cert.pem
├── tlscacerts
│   └── tls-ca-cert.pem
└── users

Org1的MSP如下:

/tmp/hyperledger/org1/msp
├── admincerts
│   └── admin-org1-cert.pem
├── cacerts
│   └── org1-ca-cert.pem
├── tlscacerts
│   └── tls-ca-cert.pem
└── users

Org2的如下:

/tmp/hyperledger/org2/msp
├── admincerts
│   └── admin-org2-cert.pem
├── cacerts
│   └── org2-ca-cert.pem
├── tlscacerts
│   └── tls-ca-cert.pem
└── users

一旦所有的MSP存在orderer主机上,你可以在configtx.yaml文件存在的目录下执行一下命令

configtxgen -profile OrgsOrdererGenesis -outputBlock /tmp/hyperledger/org0/orderer/genesis.block -channelID syschannel
configtxgen -profile OrgsChannel -outputCreateChannelTx /tmp/hyperledger/org0/orderer/channel.tx -channelID mychannel

这将产生genesis.blockchannel.tx,这两个文件将在后续的步骤中使用

收集证书的命令

Fabric CA Client有一个对命令,可用于获取证书用于orderer创世和peer MSP设置。 第一个命令是fabric-ca-client certificate用户获取证书为admincerts文件目录, 第二个命令是fabric-ca-client getcainfo用于收集证书为cacertstlscacerts目录。

Mutual TLS

可以使用相互TLS来确保端点。如果CA,PEER或Orderer使用相互TLS,则客户端还必须呈现将由服务器验证的TLS证书。相互TLS要求客户端获取它将呈现给服务器的TLS证书。获取TLS证书可以通过TLS证书颁发机构完成,该权限确实已启用了相互TLS。一旦客户端获取了TLS证书,那么只要服务器上的受信任的TLS权限与客户端的TLS证书的发布权限相同,它就可以启用与相互TLS的服务器进行通信。

Launch Orderer

创建Genesis块和通道事务后,您可以定义指向Genesis.Block的orderer服务。

orderer1-org0:
  container_name: orderer1-org0
  image: hyperledger/fabric-orderer
  environment:
    - 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/logs
  volumes:
    - /tmp/hyperledger/org0/orderer:/tmp/hyperledger/org0/orderer/
  networks:
    - fabric-ca

启动Orderer服务将显示一个orderer容器,以及在日志中,您将看到以下行:

UTC [orderer/common/server] Start -> INFO 0b8 Beginning to serve requests

Create CLI Containers

与peer的通信需要CLI容器,容器包含适当的二进制文件,允许您发出peer相关命令。您将为每个组织创建一个CLI容器。在此示例中,我们为每个ORG的PEER1在与PEER1中启动CLI容器。

Launch Org1’s CLI

cli-org1:
   container_name: cli-org1
   image: hyperledger/fabric-tools
   tty: true
   stdin_open: true
   environment:
     - GOPATH=/opt/gopath
     - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
     - FABRIC_LOGGING_SPEC=DEBUG
     - CORE_PEER_ID=cli-org1
     - 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/peer1/msp
   working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org1
   command: sh
   volumes:
     - /tmp/hyperledger/org1/peer1:/tmp/hyperledger/org1/peer1
     - /tmp/hyperledger/org1/peer1/assets/chaincode:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode
     - /tmp/hyperledger/org1/admin:/tmp/hyperledger/org1/admin
   networks:
     - fabric-ca

Launch Org2’s CLI

cli-org2:
   container_name: cli-org2
   image: hyperledger/fabric-tools
   tty: true
   stdin_open: true
   environment:
     - GOPATH=/opt/gopath
     - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
     - FABRIC_LOGGING_SPEC=DEBUG
     - CORE_PEER_ID=cli-org2
     - 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/peer1/msp
   working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org2
   command: sh
   volumes:
     - /tmp/hyperledger/org2/peer1:/tmp/hyperledger/org2/peer1
     - /tmp/hyperledger/org1/peer1/assets/chaincode:/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode
     - /tmp/hyperledger/org2/admin:/tmp/hyperledger/org2/admin
   networks:
     - fabric-ca

Create and Join Channel

Org1

docker exec -it cli-org1 sh
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/admin/msp
peer channel create -c mychannel -f /tmp/hyperledger/org1/peer1/assets/channel.tx -o orderer1-org0:7050 --outputBlock /tmp/hyperledger/org1/peer1/assets/mychannel.block --tls --cafile /tmp/hyperledger/org1/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/admin/msp
export CORE_PEER_ADDRESS=peer1-org1:7051
peer channel join -b /tmp/hyperledger/org1/peer1/assets/mychannel.block

export CORE_PEER_ADDRESS=peer2-org1:7051
peer channel join -b /tmp/hyperledger/org1/peer1/assets/mychannel.block

Org2

docker exec -it cli-org2 sh
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/admin/msp
export CORE_PEER_ADDRESS=peer1-org2:7051
peer channel join -b /tmp/hyperledger/org2/peer1/assets/mychannel.block

export CORE_PEER_ADDRESS=peer2-org2:7051
peer channel join -b /tmp/hyperledger/org2/peer1/assets/mychannel.block