翻译:https://hyperledger-fabric-ca.readthedocs.io/en/latest/operations_guide.html
本文档会展示如何使用Fabric CA来安装一个Fabric 网络。区块链网络中所有身份必须经过授权。这种授权是以加密材料的形式提供的,并根据可信的权威机构进行验证。
本指南中,会展示启动一个包含两个组织,每个组织中包含一个peer,一个orderer的区块链网络。展示如何创建orderer,peer,administrator,终端用户生成加密材料,以便私钥不会离开生成它们的主机或容器。
本例的结构图如下图所示
本例会使用docker容器部署。容器将会被视为在不同的主机上运行。这样做是为了展示资源如何在网络中交换。
容器的网络配置为同一个网络。如果你部署在不同的网络中,那本例展示的步骤需要调整。
下面的文档解析docker-compose文件,来说明各个组件。查看完整docker-compose,点击这里here。
每个主机都需要加密素材,需要fabric-ca-client在主机上可运行。fabric-ca-client会用来链接server容器。
下载client可执行文件,到 repository并选择最新的版本下载。
注意:本例采用fabric ca client v1.4.0
一个TLS CA用来签发TLS证书。为了确保不同进程之间的通信安全,需要这些证书。
为了方便,本例中所有组织都将使用相同的TLS CA并且TLS相互身份验证被禁用。
注意:在生产环境中,你需要使用组织的CA来获取TLS证书。你需要将你的CA证书传送给验证TLS证书的组织。这样,和本例不同,每个组织会有自己的TLS CA。
一个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
容器启动成功,会在容器日志中看到如下输出
[INFO] Listening on https://0.0.0.0:7052
此时TLS CA服务正在监听安全socket,可以颁发TLS证书。
登录TLS CA‘s Admin
在开始使用CA客户端之前,你必须获取 CA’s TLS的签名证书。使用TLS链接之前,这是必要一步。
本例中,你需要在运行TLS CA server的服务器上获得/tmp/hyperledger/tls-ca/crypto/ca-cert.pem,且复制文件到运行CA client的主机上。这个证书,TLS CA签名证书,会被用来验证CA的TLS证书。证书复制到CA client的主机上后,你可以开始使用CA
TLS CA的签名证书将需要针对TLS CA运行命令的每个主机上可用。
TLS CA server是使用具有全完管理权限的引导标示启动的。管理员的一个关键能力是注册新身份的能力。CA的admin管理员会使用Fabric CA client注册四个新的身份,每个peer,一个orderer。这些身份会用来为peer和orderer来获取TLS证书。
运行下面的命令来登录TLS CA admin并注册身份。我们假设根证书复制后放在了所有主机的/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:[email protected]: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
注意:如果FABRIC_CA_CLIENT_TLS_CERTFILES 不是绝对路径,它将被解析为客户端的主目录。
使用TLS CA注册的身份,我们可以启动每个组织网络。任何时候我们需要获取组织内节点的TLS证书,需要指向到CA。
安装order组织CA
每个组织必须有自己的证书颁发机构(CA)来签发证书。此CA会签发组织内的peer和client证书。你的CA创建属于你组织的标识,并为每个标识颁发一个公钥和私钥。这些键允许所有节点和应用程序对其进行签名和验证。网络的其它成员将理解由CA签名的任何标识,以及标识属于您组织的组件。
管理员启动Org0(应是orderer)以Fabric CA容器的方式,它将被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
一个成功启动的容器,你会看到容器日志中如下输出:
[INFO] Listening on https://0.0.0.0:7053
此时服务器正在监听安全socket,并可以开始发布加密素材。
你可以执行如下命令来登陆CA admin且注册Org0的身份。
如下命令,我们假设CA TLS根证书已经复制到主机的/tmp/hyperledger/org0/ca/crypto/ca-cert.pem上。如果client执行文件在不同的主机上,你需要获取签发证书。
注册下面的身份:
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:[email protected]: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目录下。
看到如下文件结构:
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 client产生的,这文件包含了CA client的配置文件。有三个重要文件需要注意。首先一个是0-0-0-0-7053.pem,这是CA为此身份签发的公开证书。第二个是60b6a16b8b5ba3fc3113c522cce86a724d7eb92d6c3961cfd9afbd27bf11c37f_sk,这是client生成的私钥。此文件名每次都不同。最后一个是cert.pem,这是admin的证书。
安装Org1的CA
Org0相同的步骤应用到Org1的CA
Org1的管理员会启动Fabric CA容器,用来签发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监听了安全的socket,可以用来签发加密素材。
执行以下命令来登录CA Admin并注册Org1的身份。
会注册下面的身份:
下面的命令,假设已经将更证书复制到主机的/tmp/hyperledger/org1/ca/crypto/ca-cert.pem。如果client执行文件在不同的主机上,你需要获取签名证书。
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:[email protected]: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的CA
Org1的步骤应用到Org2上。我们快速浏览Org2的操作
docker服务内容如下 ,来启动Org2的Fabric 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
成功启动容器后,会在CA容器日志中看到
[INFO] Listening on https://0.0.0.0:7055
CA server已经监听了安全的socket,可以签发加密素材。
执行下面的命令来登陆CA admin登录且注册peer相关身份。在如下命令中,我们假设根证书已经复制到/tmp/hyperledger/org2/ca/crypto/ca-cert.pem
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:[email protected]: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
一旦CA启动并运行了,我们可以开始登录peers。
Org1的管理员使用CA登录peer然后启动peer容器。在启动peer之前,你需要登录peer身份获取MSP。这就是peer的MSP。
登录peer1
主机运行需要client的可执行文件。
下面的命令,假设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:[email protected]:7054
下一步来获取peer的TLS加密素材。这需要另一个登录,但这次将根据tls CA上的tls配置文件注册。你也需要提供Peer1的主机地址在登录请求中,放入csr.hosts。下面的命令执行之前,假设已经将根证书复制到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:[email protected]:7052 --enrollment.profile tls --csr.hosts peer1-org1
到目录/tmp/hyperledger/org1/peer1/tls-msp/keystore
且该key的名为key.pem。这会是下面的步骤容易一些。
此时,会有两个MSP目录。一个MSP包含peer的登录证书,另一个有peer的TLS证书。但是,需要在注册MSP目录中添加一个附加文件夹,这个是admincerts
目录。此目录包含Org1的admin的证书。后面会具体介绍。
登录peer2
peer2执行相似的命令,下面的命令,假设Org1的根证书复制到了peer2的主机/tmp/hyperledger/org1/peer2/assets/ca/org1-ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/peer2
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer2/assets/ca/org1-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://peer2-org1:[email protected]:7054
下一步获取peer的TLS加密素材。这需要另一个登录,但这次更具TLS CA上的tls配置文件注册。需要Peer2的主机地址。下面的命令假设TLS CA证书复制到peer2主机的/tmp/hyperledger/org1/peer2/assets/tls-ca/tls-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer2/assets/tls-ca/tls-ca-cert.pem
fabric-ca-client enroll -d -u https://peer2-org1:[email protected]:7052 --enrollment.profile tls --csr.hosts peer2-org1
到/tmp/hyperledger/org1/peer2/tls-msp/keystore并更改key的名字为key.pem。这会使后面的步骤更容易一些。
此时,我们有两个MSP目录,一个包含peer登陆证书,一个是peer的TLS证书。当登陆了admin登录后会增加admincerts
文件夹。
登录Org1 Admin
此时,两个peer都已经登录了,现在,你需要登录Org1的admin身份。管理员身份负责诸如安装和实例化链码之类的活动。下面的步骤会登录admin。在如下命令中,我们假设在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:[email protected]:7054
登录之后,会有admin的msp。需要从msp中复制证书到peer的msp的admincerts
文件夹中。需要将admin证书在组织内的peer中传播,这需要到每个peer的msp的admincerts
文件夹中
下面命令只是为Peer1,将管理员证书交换给peer2需要外部执行
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的peer
当我们获取了peer和org admin的证书后,我们有了启动peer所需的msp
一个docker服务,像下面一样会启动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]
docker服务,如下内容,会启动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
启动peer后会看到日志的如下输出
serve -> INFO 020 Started peer with ID=[name:"peer2-org1" ], network ID=[dev], address=[peer2-org1:7051]
Org2的admin会使用CA的引导身份来登录peer并启动peer容器。
登录peer1
执行以下命令登陆peer1.假设Org2的根证书复制到peer1的主机上/tmp/hyperledger/org2/peer1/assets/ca/org2-ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org2/peer1
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer1/assets/ca/org2-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://peer1-org2:[email protected]:7055
下一步,获取TLS证书。下面命令假设TLS CA证书复制到peer1主机上/tmp/hyperledger/org2/peer1/assets/tls-ca/tls-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer1/assets/tls-ca/tls-ca-cert.pem
fabric-ca-client enroll -d -u https://peer1-org2:[email protected]:7052 --enrollment.profile tls --csr.hosts peer1-org2
到/tmp/hyperledger/org2/peer1/tls-msp/keystore目录并改名key.pem
登录peer2
执行以下命令登录peer2.假设Org2的根证书复制到peer2的主机上/tmp/hyperledger/org2/peer2/tls/org2-ca-cert.pem
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org2/peer2
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer2/assets/ca/org2-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://peer2-org2:[email protected]:7055
下一步,你会获取TLS证书。假设TLS CA证书复制到peer2主机上/tmp/hyperledger/org2/peer2/assets/tls-ca/tls-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer2/assets/tls-ca/tls-ca-cert.pem
fabric-ca-client enroll -d -u https://peer2-org2:[email protected]:7052 --enrollment.profile tls --csr.hosts peer2-org2
到目录/tmp/hyperledger/org2/peer2/tls-msp/keystore并改名key.pem
登录Org2 Admin
此时有了两个msp目录。一个msp包含了登录证书,另一个有TLS证书。然而,需要一个附加目录到MSP文件夹,这就是admincerts目录。这个文件夹包含 Org2的admin证书。下面会登录admin。如下命令,我们假设在peer1主机上执行。
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org2/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer1/assets/ca/org2-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://admin-org2:[email protected]:7055
登录后,你需要有admin的msp,需要从msp中复制证书到peer的msp下的admincerts
中。下面命令只是peer1,peer2的复制在外部执行。
mkdir /tmp/hyperledger/org2/peer1/msp/admincerts
cp /tmp/hyperledger/org2/admin/msp/signcerts/cert.pem /tmp/hyperledger/org2/peer1/msp/admincerts/org2-admin-cert.pem
如果admincerts
目录缺失,peer不能启动。
启动Org2的peers
一旦我们有了peer和admin的msp就可以启动peer了。
docker服务如下,会启动peer1的容器
peer1-org2:
container_name: peer1-org2
image: hyperledger/fabric-peer
environment:
- 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=debug
- 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=true
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org2/peer1
volumes:
- /var/run:/host/var/run
- /tmp/hyperledger/org2/peer1:/tmp/hyperledger/org2/peer1
networks:
- fabric-ca
启动peer容器,会有如下日志
serve -> INFO 020 Started peer with ID=[name:"peer1-org2" ], network ID=[dev], address=[peer1-org2:7051]
一个docker服务,如下面会启动peer1
peer2-org2:
container_name: peer2-org2
image: hyperledger/fabric-peer
environment:
- 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=debug
- 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:7051
working_dir: /opt/gopath/src/github.com/hyperledger/fabric/org2/peer2
volumes:
- /var/run:/host/var/run
- /tmp/hyperledger/org2/peer2:/tmp/hyperledger/org2/peer2
networks:
- fabric-ca
启动peer会触发peer容器,并会有如下输出
serve -> INFO 020 Started peer with ID=[name:"peer2-org2" ], network ID=[dev], address=[peer2-org2:7052]
最后一步启动的是orderer。在启动之前需要一些动作。
在启动orderer之前,需要使用CA来登录orderer身份获取MSP。这就是orderer的本地msp。
需要执行以下命令来登录。下面的命令,我们假设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:[email protected]: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:[email protected]:7052 --enrollment.profile tls --csr.hosts orderer1-org0
到目录/tmp/hyperledger/org0/orderer/tls-msp/keystore然后改名为key.pem
此时会有两个msp目录。一个msp包含了登录证书,另一个包含了TLS证书。然而,在登陆证书的msp中还需要一个admincerts
文件夹。这个文件夹包含了peer 1的 admin。现在登录Org0的admin执行以下命令。
登录Org0的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://orderer-org0-admin:[email protected]:7053
登录之后,msp文件夹会在/tmp/hyperledger/org0/admin。你需要复制MSP证书并复制到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需要一个创始区块,来引导它自己。可以在 Hyperledger Fabric documentation查看更多信息。
在下面的文档中,你需要找一个configtx.yaml,用来指定部署。完整的configtx.yaml在 here
在orderer主机上,我们需要收集所有组织的MSP。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包含了Org0的根证书(Org0的admin证书),还有TLS CA的根证书。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的MSP如下
/tmp/hyperledger/org2/msp
├── admincerts
│ └── admin-org2-cert.pem
├── cacerts
│ └── org2-ca-cert.pem
├── tlscacerts
│ └── tls-ca-cert.pem
└── users
一旦这些MSP在orderer,就可以执行如下命令
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 genesis和peer的MSP。
第一个证书命令,这个命令来获取admincert文件的证书。查阅listing certificate information
第二个命令getcainfo。这个命令用来收集cacert和tlscacert文件夹的证书。getcainfo 命令返回CA证书。
终端也可以使用相互TLS。如果CA,Peer,或Orderer使用了相互的TLS,那么客户端必须也要提供TLS证书用于server验证。
相互TLS需要客户端TLS证书。可以通过启用相互TLS的TLS证书颁发机构来获取TLS证书。如果client获取了TLS证书,只要服务器上受信的TLS授权与客户端TLS证书的颁发机构相同,它就可以开始与相互启动TLS的服务器通信。
一旦你创建了起始区块和通道事务,你可以定义一个orderer服务指向到genesis.block。
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
和peer通信需要CLI容器,容器包含了适合的执行文件,可以用来指向peer相关命令。需要为每个org创建CLI容器。本例中,每个组织我们都启动以CLI容器peer1的身份。
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
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
CLI容器启动和运行,你可以执行创建和加入通道。到这里,你可以执行下面命令使用admin的MSP
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
channel.tx是在orderer上执行configtxgen
命令的产物。这个文件需要传输到peer1的主机上。上述命令会在peer1上生成/tmp/hyperledger/org1/peer1/assets/mychannel.block,会用来将peer加入到通道中。mychannel.block需要传输到Org1和Org2的所有peer上。
下属命令会将peer1和peer2加入到通道。
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
运行如下命令到CLI容器中。
docker exec -it cli-org2 sh
在Org2时,你需要所有peer加入到通道中。Org2的peer不需要创建通道,这个Org1已经做了。在Org2的CLI容器中,你需要使用admin的MSP执行如下命令:
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
在所有组织的peer1上下载链码 chaincode 。
在peer1,你需要安装链码。命令假设链码需要安装在GOPATH中。本例,我们假设链码在/opt/gopath/src/github.com/hyperledger/fabric-samples/chaincode/abac/go,GOPATH是/opt/gopath。从Org1的CLI容器,你需要执行如下命令
export CORE_PEER_ADDRESS=peer1-org1:7051
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/admin/msp
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric-samples/chaincode/abac/go
peer2有相同的步骤
export CORE_PEER_ADDRESS=peer2-org1:7051
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/admin/msp
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric-samples/chaincode/abac/go
在peer1,你需要执行和Org1上相同的步骤。假设链码安装在/opt/gopath/src/github.com/hyperledger/org2/peer1/assets/chaincode/abac/go。从Org2的CLI容器,你需要执行下面的命令
export CORE_PEER_ADDRESS=peer1-org2:7051
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/admin/msp
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric-samples/chaincode/abac/go
peer2上执行相同步骤
export CORE_PEER_ADDRESS=peer2-org2:7051
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/admin/msp
peer chaincode install -n mycc -v 1.0 -p github.com/hyperledger/fabric-samples/chaincode/abac/go
下一步实例化链码,执行如下:
peer chaincode instantiate -C mychannel -n mycc -v 1.0 -c '{"Args":["init","a","100","b","200"]}' -o orderer1-org0:7050 --tls --cafile /tmp/hyperledger/org2/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
在Org1的容器,执行:
export CORE_PEER_ADDRESS=peer1-org1:7051
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/admin/msp
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
会返回100
在Org2容器,执行:
export CORE_PEER_ADDRESS=peer1-org2:7051
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/admin/msp
peer chaincode invoke -C mychannel -n mycc -c '{"Args":["invoke","a","b","10"]}' --tls --cafile /tmp/hyperledger/org2/peer1/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
这回从a中向b转译10,现在,如果查询运行如下:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
值会返回90.