本文将介绍如何使用Fabric CA
构建一个Fabric
网络,所有的构建fabric
区块链网络的身份必须都要授权。该授权以加密材料的形式提供,这些材料是针对可信任当局验证的。
在本指南中,您将看到设置包含两个组织的区块链的过程,每个网络都有两个peer节点和一个orderer节点。您将了解如何为orders节点,peers节点,administrators和end users生成加密材料,以便私钥永远不会留在生成他们的主机或容器上。
拓扑
在此示例中,我们将研究如何在三个组织中设置order,peer和CAs。可以在下面的图像中看到此部署的拓扑:
此示例将使用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.block
和channel.tx
,这两个文件将在后续的步骤中使用
收集证书的命令
Fabric CA Client有一个对命令,可用于获取证书用于orderer创世和peer MSP设置。
第一个命令是fabric-ca-client certificate
用户获取证书为admincerts
文件目录,
第二个命令是fabric-ca-client getcainfo
用于收集证书为cacerts
和tlscacerts
目录。
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