Hyperledger Fabric CA操作手册翻译

翻译:https://hyperledger-fabric-ca.readthedocs.io/en/latest/operations_guide.html

Fabric CA操作手册

本文档会展示如何使用Fabric CA来安装一个Fabric 网络。区块链网络中所有身份必须经过授权。这种授权是以加密材料的形式提供的,并根据可信的权威机构进行验证。

本指南中,会展示启动一个包含两个组织,每个组织中包含一个peer,一个orderer的区块链网络。展示如何创建orderer,peer,administrator,终端用户生成加密材料,以便私钥不会离开生成它们的主机或容器。

Topology(结构图)

本例的结构图如下图所示

Hyperledger Fabric CA操作手册翻译_第1张图片

本例会使用docker容器部署。容器将会被视为在不同的主机上运行。这样做是为了展示资源如何在网络中交换。

容器的网络配置为同一个网络。如果你部署在不同的网络中,那本例展示的步骤需要调整。

下面的文档解析docker-compose文件,来说明各个组件。查看完整docker-compose,点击这里here。

安装CAs

下载fabric-ca-client执行文件

每个主机都需要加密素材,需要fabric-ca-client在主机上可运行。fabric-ca-client会用来链接server容器。

下载client可执行文件,到 repository并选择最新的版本下载。

注意:本例采用fabric ca client v1.4.0

安装TLS CA

一个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,并可以开始发布加密素材。

登录Orderer Org CA Admin

你可以执行如下命令来登陆CA admin且注册Org0的身份。

如下命令,我们假设CA TLS根证书已经复制到主机的/tmp/hyperledger/org0/ca/crypto/ca-cert.pem上。如果client执行文件在不同的主机上,你需要获取签发证书。

注册下面的身份:

  • 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:[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,可以用来签发加密素材。

登录Org1的CA Admin

执行以下命令来登录CA Admin并注册Org1的身份。

会注册下面的身份:

  • Peer 1 (peer1-org1)
  • Peer 2 (peer2-org1)
  • Admin (admin1-org1)
  • End user (user-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,可以签发加密素材。

登录Org2的CA Admin

执行下面的命令来登陆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

安装peer

一旦CA启动并运行了,我们可以开始登录peers。

安装Org1的Peer

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 Peer

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。在启动之前需要一些动作。

登录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证书。

Mutual TLS

终端也可以使用相互TLS。如果CA,Peer,或Orderer使用了相互的TLS,那么客户端必须也要提供TLS证书用于server验证。

相互TLS需要客户端TLS证书。可以通过启用相互TLS的TLS证书颁发机构来获取TLS证书。如果client获取了TLS证书,只要服务器上受信的TLS授权与客户端TLS证书的颁发机构相同,它就可以开始与相互启动TLS的服务器通信。

启动Orderer

一旦你创建了起始区块和通道事务,你可以定义一个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

创建CLI容器

和peer通信需要CLI容器,容器包含了适合的执行文件,可以用来指向peer相关命令。需要为每个org创建CLI容器。本例中,每个组织我们都启动以CLI容器peer1的身份。

启动Org1CLI

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

启动Org2 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

创建和加入通道

Org1

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

Org2

运行如下命令到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 。

Org1

在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

Org2

在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.

你可能感兴趣的:(区块链)