Fabric CA 操作指南
本指南将说明如何使用 Fabric CA 设置 Fabric 网络。 参与 Hyperledger Fabric 区块链网络的所有身份都必须经过授权。 此授权以加密材料的形式提供,该加密材料已针对受信任的机构进行验证。
在本指南中,您将看到设置包含两个Org的区块链网络的过程,每个Org都有两个Peer和一个Orderer。 您将了解如何为Orderer、Peer、管理员和最终用户生成加密材料,以便私钥永远不会离开生成它们的主机或容器。
拓扑
在此示例中,我们将了解如何在三个Org中设置Orderer、Peer和 CA。 此部署的拓扑如下图所示:
此示例将模拟使用 docker 容器的部署。 容器将被视为在不同的主机上运行。 这样做是为了让您可以看到哪些资产需要在网络所涉及的各方之间进行带外交换。
docker 的网络配置假设所有容器都在同一个网络中运行。 如果您的部署分布在不同的网络中,则需要调整示例以适应您的网络配置。
下面的文档分解了 docker-compose 文件以讨论各个组件。 要查看整个 docker-compose,请单击 此处。
设置 CA
下载 fabric-ca-client 二进制文件
对于需要获取加密材料的每个主机,您需要在主机上安装 fabric-ca-client 二进制文件。 客户端将用于连接到 Fabric CA 服务器容器。
要下载 fabric-ca-client 二进制文件,请浏览到此 存储库 并为您的机器选择最新的二进制文件。
注意
此示例使用 1.4.0 版的 fabric-ca-client。
设置 TLS CA
TLS CA 用于颁发 TLS 证书。 需要这些证书来保护各种进程之间的通信。
为了简化此示例,所有Org都将使用相同的 TLS CA 并禁用 TLS 相互身份验证。
注意
在生产环境中,您可能会使用Org的 CA 来获取 TLS 证书。 您必须将您的 CA 证书带外传输给将验证您的 TLS 证书的Org。 因此,与此示例不同,每个Org都将拥有自己的 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
成功启动容器后,您将在 CA 容器的日志中看到以下行。
[INFO] Listening on https://0.0.0.0:7052
此时 TLS CA 服务器正在侦听安全套接字,并且可以开始颁发 TLS 证书。
注册 TLS CA 的管理员
在开始使用 CA 客户端之前,您必须获取 CA 的 TLS 证书的签名证书。 这是您可以使用 TLS 连接之前的必需步骤。
在我们的示例中,您需要在运行 TLS CA 服务器的机器上获取位于 /tmp/hyperledger/tls-ca/crypto/ca-cert.pem
的文件,并将该文件复制到您将要安装的主机上 正在运行 CA 客户端二进制文件。 该证书也称为 TLS CA 的签名证书,将用于验证 CA 的 TLS 证书。 将证书复制到 CA 客户端的主机后,您可以开始使用 CA 发出命令。
每个将针对 TLS CA 运行命令的主机上都需要有 TLS CA 的签名证书。
TLS CA 服务器以具有服务器完全管理员权限的引导身份启动。 管理员的一项关键能力是注册新身份的能力。 该 CA 的管理员将使用 Fabric CA 客户端向 CA 注册四个新身份,一个用于每个Peer,一个用于Orderer。 这些身份将用于为 peer 和 orderer 获取 TLS 证书。
您将发出以下命令来注册 TLS CA 管理员,然后注册身份。 我们假设 TLS CA 的受信任根证书已复制到将通过 fabric-ca- 与该 CA 通信的所有主机上的“/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
注意
如果环境变量 FABRIC_CA_CLIENT_TLS_CERTFILES 的路径不是绝对路径,它将被解析为相对于客户端的主目录。
使用在 TLS CA 上注册的身份,我们可以继续设置每个Org的网络。 每当我们需要为Org中的节点获取 TLS 证书时,我们都会参考这个 CA。
设置OrdererOrg CA
每个Org都必须有自己的证书颁发机构 (CA) 来颁发注册证书。 CA 将为Org中的每个Peer和客户端颁发证书。
您的 CA 创建属于您的Org的身份并向每个身份颁发公钥和私钥。 这些密钥允许您的所有节点和应用程序签名并验证其操作。 由您的 CA 签名的任何身份都将被网络的其他成员理解,以识别属于您Org的组件。
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 服务器正在侦听安全套接字,并且可以开始发布加密材料。
注册OrdererOrg的 CA 管理员
您将发出以下命令来注册 CA 管理员,然后注册 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
您在上面执行的注册命令将使用 CA 发布的加密材料填充 /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客户端生成的文件,该文件包含CA客户端的配置。 还有其他三个重要文件需要注意。 第一个是“0-0-0-0-7053.pem”,这是颁发此身份证书的 CA 的公共证书。 其次是60b6a16b8b5ba3fc3113c522cce86a724d7eb92d6c3961cfd9afbd27bf11c37f_sk
,这是客户端生成的私钥。 该文件的名称是可变的,每次生成密钥时都会有所不同。 最后一项是cert.pem
,这是由CA签署和颁发的管理员证书。
设置 Org1 的 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 服务器正在侦听安全套接字,并且可以开始发布加密材料。
注册 Org1 的 CA 管理员
您将发出以下命令来注册 CA 管理员,然后注册 Org1 的两个身份。
-
正在注册以下身份:
Peer 1 (peer1-org1)Peer 2 (peer2-org1)Admin (admin1-org1)End user (user-org1)
在下面的命令中,我们将假设 CA 的 TLS 证书的受信任根证书已复制到 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 的 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 服务器正在侦听安全套接字,并且可以开始发布加密材料。
注册 Org2 的 CA 管理员
您将发出以下命令以注册 CA 管理员并注册所有Peer相关身份。 在下面的命令中,我们将假设 CA 的 TLS 证书的可信根证书已复制到 /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: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
设置Peer
一旦 CA 启动并运行,我们就可以开始注册Peer了。
设置 Org1 的Peer
Org1 的管理员将使用其 CA 注册Peer,然后启动Peer docker 容器。 在启动Peer之前,您需要向 CA 注册Peer身份以获取Peer将使用的 MSP。 这称为本地Peer MSP。
注册 Peer1
如果运行 Peer1 的主机没有 fabric-ca-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: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.pem
。 这将便于在后面的步骤中参考。
此时,您将拥有两个 MSP 目录。 一个 MSP 包含Peer的注册证书,另一个具有Peer的 TLS 证书。 但是,需要在注册 MSP 目录中添加一个额外的文件夹,这是 admincerts
文件夹。 此文件夹将包含 Org1 管理员的证书。 当我们在下面注册 Org1 的管理员时,我们会更多地讨论这个问题。
注册 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:peer2PW@0.0.0.0:7054
下一步是获取Peer的 TLS 加密材料。 这需要再次注册,但这次您将根据 TLS CA 上的“tls”配置文件进行注册。 您还需要在注册请求中提供 Peer2 主机的地址作为 csr.hosts
标志的输入。 在下面的命令中,我们假设 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:peer2PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer2-org1
转到路径 /tmp/hyperledger/org1/peer2/tls-msp/keystore
并将密钥的名称更改为 key.pem
。 这将便于在后面的步骤中参考。
此时,您将拥有两个 MSP 目录。 一个 MSP 包含Peer的注册证书,另一个具有Peer的 TLS 证书。 注册管理员后,您将把 admincerts
文件夹添加到注册 MSP。
注册 Org1 的管理员
至此,两个同行都已注册。 现在,您将注册 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,管理员证书与 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 的 Peers
一旦我们注册了所有Peer和Org管理员,我们就有了必要的 MSP 来启动Peer。
如下所示的 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服务将打开一个Peer容器,在日志中您将看到以下行:
serve -> INFO 020 Started peer with ID=[name:"peer2-org1" ], network ID=[dev], address=[peer2-org1:7051]
设置 Org2 的Peer
Org2 的管理员将使用 CA 的引导身份向 CA 注册Peer,然后启动Peer docker 容器。
注册 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:peer1PW@0.0.0.0: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:peer1PW@0.0.0.0: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/assets/ca/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:peer2PW@0.0.0.0: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:peer2PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer2-org2
转到路径 /tmp/hyperledger/org2/peer2/tls-msp/keystore
并将密钥的名称更改为 key.pem
。
注册 Org2 的管理员
此时,您将拥有两个 MSP 目录。 一个 MSP 包含您的注册证书,另一个包含您的 TLS 证书。 但是,需要在注册 MSP 目录中添加一个额外的文件夹,这是 admincerts
文件夹。 此文件夹将包含 Org2 管理员的证书。 以下步骤将注册管理员。 在下面的命令中,我们将假设它们正在 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:org2AdminPW@0.0.0.0:7055
注册后,您应该有一个管理员 MSP。 您将从该 MSP 复制证书并将其移动到“admincerts”文件夹下的Peer MSP。 以下命令仅适用于 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
如果 peer 的本地 MSP 中缺少 admincerts
文件夹,则 peer 将无法启动。
启动 Org2 的 Peers
一旦我们注册了所有Peer节点和管理员,我们就有了启动Peer节点所需的 MSP。
一个 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服务将打开一个Peer容器,在日志中您将看到以下行:
serve -> INFO 020 Started peer with ID=[name:"peer1-org2" ], network ID=[dev], address=[peer1-org2:7051]
如下所示的 docker 服务可用于为 peer2 启动容器。
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
在启动 orderer 之前,您需要向 CA 注册 orderer 的身份,以获取 orderer 将使用的 MSP。 这称为本地Orderer 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.pem
。
此时,您将拥有两个 MSP 目录。 一个 MSP 包含您的注册证书,另一个包含您的 TLS 证书。 但是,需要在注册 MSP 目录中添加一个额外的文件夹,即 admincerts
文件夹。 此文件夹将包含Peers 1 管理员的证书。现在,您将通过发出以下命令来注册 Org0 的管理员身份。
注册 Org0 的管理员
下面的命令假定这是在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
注册后,您应该在 /tmp/hyperledger/org0/admin
有一个 msp 文件夹。 您将从该 MSP 复制证书并将其移动到“admincerts”文件夹下的orderer MSP。
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 文档 中找到更多信息
在下面的文档中,您会找到为此特定部署编写的 configtx.yaml
片段。 如需完整的 configtx.yaml
,请单击 此处。
在 orderer 的主机上,我们需要收集所有Org的 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 将包含 Org0 的可信根证书、Org0 管理员身份的证书和 TLS CA 的可信根证书。 MSP 文件夹结构如下所示。
/tmp/hyperledger/org0/msp
├── admincerts
│ └── admin-org0-cert.pem
├── cacerts
│ └── org0-ca-cert.pem
├── tlscacerts
│ └── tls-ca-cert.pem
└── users
所有Org的模式都是相同的。 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 的主机上,您将从 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 客户端有几个命令可用于获取 orderer genesis 和 peer MSP setup 的证书。
第一个命令是 fabric-ca-client certificate 命令。 此命令可用于获取 admincerts 文件夹的证书。 有关如何使用该命令的更多信息,请参考:列出证书信息
第二个命令是 fabric-ca-client getcainfo 命令。 此命令可用于收集 cacerts 和 tlscacerts 文件夹的证书。 getcainfo 命令返回 CA 的证书。
双向 TLS
端点也可以使用 Mutual TLS 来保护。 如果 CA、Peer 或 Orderer 使用双向 TLS,则客户端还必须提供一个 TLS 证书,该证书将由服务器验证。
双向 TLS 要求客户端获取将呈现给服务器的 TLS 证书。 可以通过启用了双向 TLS 的 TLS 证书颁发机构来获取 TLS 证书。 一旦客户端获得了 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
创建 CLI 容器
与Peers点的通信需要一个 CLI 容器,该容器包含适当的二进制文件,允许您发出Peers点相关的命令。 您将为每个Org创建一个 CLI 容器。 在此示例中,我们为每个Org在与 Peer1 相同的主机中启动 CLI 容器。
启动 Org1 的 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
启动 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 容器启动并运行,您现在可以发出命令来创建和加入频道。 我们将使用 Peer1 创建通道。 在 Peer1 的主机中,您将执行:
docker exec -it cli-org1 sh
此命令将带您进入 CLI 容器并打开一个终端。 从这里,您将使用管理 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
命令生成的工件。 这个工件需要从 orderer 带外传输到 Peer1 的主机。 上面的命令将在 Peer1 的指定输出路径 /tmp/hyperledger/org1/peer1/assets/mychannel.block
处生成mychannel.block
,网络中所有希望加入通道的节点都将使用该路径 . 这个 mychannel.block
需要带外传输到 Org1 和 Org2 中的所有Peers方。
您要运行的下一个命令是让 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 容器。
docker exec -it cli-org2 sh
在 Org2 中,您只需要让 peer 加入频道。 Org2 中的 Peers 不需要创建通道,这已经由 Org1 完成。 在 Org2 CLI 容器中,您将使用管理 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
安装和实例化链码
从 Github 下载这个 chaincode 到两个Org的 Peer1 上的本地文件系统。
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 的 CLI 容器中,执行:
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 的 CLI 容器中,执行:
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
的值中减去 10 并将其移至 b
。 现在,如果您通过运行查询:
peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
这应该返回一个 90
的值。
Fabric CA 操作指南到此结束。
评论区