在文章《HyperLedger 实战-手动搭建一个 Fabric 网络》 中,我们介绍了 Fabric 网络的搭建过程。在启动网络之前,我们需要利用 cryptogen 以及 configtxgen 生成公私钥证书以及通道的创世区块和相关信息。而这些生成的文件,就是我们MSP实现的基础。
本文将结合《HyperLedger-Fabric 原理-MSP 详解(一)》 的理论部分以及《HyperLedger 实战-手动搭建一个 Fabric 网络》的实战部分,讲解 Fabric 中与MSP相关的文件夹及其实现方式。全文按照如下结构展开:
一、生成公私钥和证书信息
生成证书和公私钥的过程
Fabric 中有两种类型的公私钥和证书,一种是给节点之间,为了通讯安全而准备的TLS 证书,另一种是用户登录和权限控制的用户证书。这些证书本来应该是由 CA 来颁发,但是我们这里是测试环境,并没有启用 CA 节点,这里我们使用:cryptogen 来生成这两种证书。我们生成的公私钥和证书是依据配置文件 crypto-config.yaml 文件来生成的。关于该文件的详细介绍,参见《HyperLedger-Fabric1.0 原理-Fabric 网络搭建过程之配置文件》一文,这里不再赘述。
进入 fabric 根目录,运行下面命令生成公私钥证书:
cd examples/e2e_cli/
../../build/bin/cryptogen generate --config=./crypto-config.yaml
e2e_cli 例子中,生成的的网络拓扑结构如下图所示。
该命令会生成一个名为 crypto-config 的文件夹,该文件夹是基于 Fabric 网络的拓扑结构而来的:
二、目录解析
生成的文件都保存到 crypto-config 文件夹,我们可以进入该文件夹查看生成了哪些文件:
查看当前目录下的 crypto-config 目录,生成 ordererOrganizations 和 peerOrganizations 两棵组织树。
以 peerOrganizations 为例,该目录下有两个目录 org1-example-com 和 org2-example-com。(由于编辑器的原因,本文将‘.’用’-‘来表示)分别对应通道中 Org1 和 Org2 的相关证书和签名。
每个组织树下都包括 ca、msp、orderers(或 peers)、tlsca、users 五个子目录。
org1-example-com 表示 Org1 组织。
在 peers 目录下,有两个子目录 peer0-org1-example-com 和 peer1-org1-example-com 包含了这两个节点的 msp 配置信息。
如下图所示:
接下来以org1-example-com 组织树为例,每个目录和文件对应的功能讲解。
该目录的树状结构如下所示,每个文件夹的功能,在代码块中已注释:
org1.example.com/
├── ca # 存放组织 Org1 的根证书和对应的私钥文件,默认采用 EC 算法,证书为自签名。组织内的实体将基于该根证书作为证书根。
│ ├── ca.org1.example.com-cert.pem
│ └── dfb841b77804d726eea25231ae5e89a31901ca0538688a6d764731148f0bdc5b_sk
├── msp # 存放代表该组织的身份信息。
│ ├── admincerts # 组织管理员的身份验证证书,被根证书签名。
│ │ └── Admin@org1.example.com-cert.pem
│ ├── cacerts # 组织的根证书,同 ca 目录下文件。
│ │ └── ca.org1.example.com-cert.pem
│ └── tlscacerts # 用于 TLS 的 CA 证书,自签名。
│ └── tlsca.org1.example.com-cert.pem
├── peers # 存放属于该组织的所有Peer节点
│ ├── peer0.org1.example.com # 第一个 peer 的信息,包括其 msp 证书和 tls 证书两类。
│ │ ├── msp # msp 相关证书
│ │ │ ├── admincerts # 组织管理员的身份验证证书。Peer将基于这些证书来认证交易签署者是否为管理员身份。
│ │ │ │ └── Admin@org1.example.com-cert.pem
│ │ │ ├── cacerts # 存放组织的根证书
│ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ ├── keystore # 本节点的身份私钥,用来签名
│ │ │ │ └── 59be216646c0fb18c015c58d27bf40c3845907849b1f0671562041b8fd6e0da2_sk
│ │ │ ├── signcerts # 验证本节点签名的证书,被组织根证书签名
│ │ │ │ └── peer0.org1.example.com-cert.pem
│ │ │ └── tlscacerts # TLS 连接用到身份证书,即组织 TLS 证书
│ │ │ └── tlsca.org1.example.com-cert.pem
│ │ └── tls # tls 相关证书
│ │ ├── ca.crt # 组织的根证书
│ │ ├── server.crt # 验证本节点签名的证书,被组织根证书签名
│ │ └── server.key # 本节点的身份私钥,用来签名
│ └── peer1.org1.example.com # 第二个 peer 的信息,结构类似。(此处省略。)
│ ├── msp
│ │ ├── admincerts
│ │ │ └── Admin@org1.example.com-cert.pem
│ │ ├── cacerts
│ │ │ └── ca.org1.example.com-cert.pem
│ │ ├── keystore
│ │ │ └── 82aa3f8f9178b0a83a14fdb1a4e1f944e63b72de8df1baeea36dddf1fe110800_sk
│ │ ├── signcerts
│ │ │ └── peer1.org1.example.com-cert.pem
│ │ └── tlscacerts
│ │ └── tlsca.org1.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── server.crt
│ └── server.key
├── tlsca # 存放 tls 相关的证书和私钥。
│ ├── 00e4666e5f56804274aadb07e2192db2f005a05f2f8fcfd8a1433bdb8ee6e3cf_sk
│ └── tlsca.org1.example.com-cert.pem
└── users # 存放属于该组织的用户的实体
├── Admin@org1.example.com # 管理员用户的信息,其中包括 msp 证书和 tls 证书两类。
│ ├── msp # msp 相关证书
│ │ ├── admincerts # 组织根证书作为管理员身份验证证书
│ │ │ └── Admin@org1.example.com-cert.pem
│ │ ├── cacerts # 存放组织的根证书
│ │ │ └── ca.org1.example.com-cert.pem
│ │ ├── keystore # 本用户的身份私钥,用来签名
│ │ │ └── fa719a7d19e7b04baebbe4fa3c659a91961a084f5e7b1020670be6adc6713aa7_sk
│ │ ├── signcerts # 管理员用户的身份验证证书,被组织根证书签名。要被某个Peer认可,则必须放到该Peer的 msp/admincerts 目录下
│ │ │ └── Admin@org1.example.com-cert.pem
│ │ └── tlscacerts # TLS 连接用的身份证书,即组织 TLS 证书
│ │ └── tlsca.org1.example.com-cert.pem
│ └── tls # 存放 tls 相关的证书和私钥。
│ ├── ca.crt # 组织的根证书
│ ├── server.crt # 管理员的用户身份验证证书,被组织根证书签名
│ └── server.key # 管理员用户的身份私钥,被组织根证书签名。
└── User1@org1.example.com # 第一个用户的信息,包括 msp 证书和 tls 证书两类
├── msp # msp 证书相关信息
│ ├── admincerts # 组织根证书作为管理者身份验证证书。
│ │ └── User1@org1.example.com-cert.pem
│ ├── cacerts # 存放组织的根证书
│ │ └── ca.org1.example.com-cert.pem
│ ├── keystore # 本用户的身份私钥,用来签名
│ │ └── 97f2b74ee080b9bf417a4060bfb737ce08bf33d0287cb3eef9b5be9707e3c3ed_sk
│ ├── signcerts # 验证本用户签名的身份证书,被组织根证书签名
│ │ └── User1@org1.example.com-cert.pem
│ └── tlscacerts # TLS 连接用的身份证书,被组织根证书签名。
│ └── tlsca.org1.example.com-cert.pem
└── tls # 组织的根证书
├── ca.crt # 组织的根证书
├── server.crt # 验证用户签名的身份证书,被根组织证书签名
└── server.key # 用户的身份私钥用来签名。
上面目录结构中的所有文件,就是我们用 cryptogen 工具来生成的MSP需要用到的证书和相关文件。主要包括各种证书和相关的签名。
三、Peer&Orderer 配置 MSP
简介
在上面,使用工具已经为我们生成了相关的目录和对应的文件。如果没有工具,需要我们手动建立目录,以及手动配置MSP,该怎么做呢?
- 主要分成两步:
第一步:
在 peer / orderer 对应的目录下,建立几个子文件夹,放入对应的证书,签名等相关信息。
第二步:
在Peer/orderer 的配置文件中,设置证书和签名的路径。
节点的配置文件如下:(peer 对应的是 core.yaml 文件 , orderer 对应的是 orderer.yaml)。
配置过程介绍
- 第一步详细过程
要想(为 peer 节点或 orderer 节点)建立本地MSP,管理员应创建一个文件夹(如$MY_PATH/mspconfig
)并在其下包含 6 个子文件夹与一个文件:
- 文件夹 admincerts包含 PEM 文件:每个 PEM 文件对应于一个管理员证书。
- 文件夹 cacerts包含 PEM 文件:每个 PEM 文件对应于一个根 CA 的证书。
- 一个文件夹 signcerts包含节点的 X.509 证书的 PEM 文件。
- (可选)文件夹 intermediatecerts 包含一些 PEM 文件:每个 PEM 文件对应于一个中间 CA 的证书。
- (可选)一个文件夹,tlscacerts 以包含每个对应于 TLS 根 CA 证书的 PEM 文件
- (可选)文件夹
crls
包含相关 CRL。 - 文件夹 keystore包含一个 PEM 文件及节点的签名密钥;我们必须强调:现阶段还不支持 RSA 密钥。
- (可选)文件夹
tlscacerts
包含如下 PEM 文件:每个 PEM 文件对应于一个根 TLS 根 CA 的证书 - (可选)文件夹 tlsintermediatecerts 包含如下 PEM 文件:每个 PEM 文件对应于一个中间 TLS CA 的证书
在 e2e_cli 中,该 Org1 组织中的有两个节点,一个是管理员 peer0,另一个是用户 peer1。
这两个节点的文件路径如下:
../examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/peers
peers 文件夹下有两个文件,分别他们是 peer0 和 peer1 的本地MSP配置文件所在:
peer0.org1.example.com peer1.org1.example.com
进入 http://peer0.org1.example.com 文件夹下,可以看到如下两个文件夹
msp tls
此时,文件的当前目录为:
../examples/e2e_cli/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp
该目录即为 peer0.org1 节点进行 msp 配置的文件目录。
一般情况,存放 msp 配置的相关信息的文件夹可以命名为 mspconfig 或者 msp。
其中,msp 的文件目录结构如下所示:
这五个文件夹下分别放了 Peer0 节点完成证书与签名认证所需要的相关文件。
至此,完成了Peer&Orderer配置 MSP 的第一步了。
- 第二步详细过程
第一步的主要目的,是准备相关的证书和签名。第二步,就是要将这些文件路径配置到 Peer | Orderer的配置文件中。这样,在启动节点时,就能够找到相应的证书和签名进行认证。
在节点的配置文件中,
peer 对应的是 core.yaml 文件;
orderer 对应的是 orderer.yaml。
我们需要在这些配置文件中指定 mspconfig 文件夹的路径和节点 MSP 的 MSP 标识符。
那么到底如何来指定呢?
下面将逐一讲解:
Peer 节点配置
当 Peer 节点作为服务端启动时,会按照优先级从高到低的顺序依次尝试从命令行参数、环境变量或配置文件中读取配置信息。这里,我们主要通过配置文件的方式来对 Peer 进行配置。
- 读取配置信息的顺序
- Peer 节点默认的配置文件读取路径为$FABRIC_CFG_PATH/core.yaml;
- 如果没找到,则尝试查找当前目录下的./core.yaml 文件;
- 如果还没有找到,则尝试查找默认的/etc/hyperledger/fabric/core.yaml 文件。
在结构上,core.yaml 文件中一般包括 logging、peer、vm、chaincode、ledger 五大部分,其中,与 MSP 配置相关的主要是 peer 部分。下面见介绍如何对 Peer 部分进行配置,实现 MSP。
peer 部分包括了许多跟服务直接相关的核心配置,内容也比较多,包括 msp 配置、gossip、events、tls 等多个配置部分,如下图所示:
下面将着重介绍通用配置中的 MSP 配置:
进入 core.yaml 文件夹,以下部分是关于 MSP 的配置
配置——>·mspConfigPath:
MSP 目录所在的路径,可以为绝对路径,或相对配置目录的路径,一般建议为/etc/hyperledger/fabric/msp;本例中,写的是相对路径 msp
配置——->localMspId:
Peer 所关联的 MSP 的 ID,一般为组织单位名称,需要与联盟配置中的名称一致;
到这里,就已经完成了对 Peer 节点的 LocalMSP 配置。
Orderer节点配置
orderer 节点对应的配置文件是 orderer.yaml。
Orderer节点可以组成集群来在 Fabric 网络中提供排序服务。类似地,支持从命令行参数、环境变量或配置文件中读取配置信息。
当从环境变量中读入配置时,需要以 ORDERER_ 前缀开头,例如配置文件中的 general.ListenAddress 项,对应到环境变量 ORDERER_GENERAL_LISTENADDRESS。
在结构上,orderer.yaml 文件中一般包括General、FileLedger、RAMLedger、Kafka四大部分,其中,涉及 MSP 配置的部分在 General。General 部分的配置如下所示:
其中,LocalMSPDir,LocalMSPID 为配置本地 msp 的主要部分。进入该 orderer.yaml 文件,该部分如下图所示:
配置——>LocalMSPDir:
MSP 目录所在的路径,可以为绝对路径或相对路径,一般建议为$FABRIC_CFG_PATH/msp;
配置——>localMspId:
Orderer所关联的 MSP 的 ID,需要与联盟配置中的组织的 MSP 名称一致;
到这里,就已经完成了对 Orderer 节点的 LocalMSP 配置。
四、总结
在这一篇文章中,我们发现 Fabric 的配置是一门很大的学问。这里,对 msp 的实现,就是通过配置文件来实现的。
我们通过相关工具,生成了系统中所需要的证书和签名等。
这一部分涉及 crypro-config.yaml 文件。
利用该配置文件,我们可以定义网络拓扑,以及生成相关证书。
生成 MSP 相关证书和文件后,我们对 Peer 和 Orderer 进行了 MSP 配置。这一部分也是通过配置文件来实现的。
core.yaml 是 Peer 节点的配置文件,通过对 Peer 部分的 mspConfigPath 和 localMspId 字段,来完成 msp 配置。
Orderer.yaml 是 Orderer 节点的配置文件,通过对 General 部分的 LocalMSPDir 和 localMspId 字段,来完成 msp 配置。
到目前为止,我们了解了 MSP 的基本组成,基本功能,以及对 Peer&Orderer 节点的配置。
总结下来,MSP 的 peer&Orderer 节点配置就是,在每一个 Peer 节点和排序服务节点上设置 MSP 目录,放入相关的证书和签名公私钥,然后在对应的配置文件中,设置 msp 文件路径。Peer 节点和排序服务节点就有了签名证书,在通道节点之间传输数据时,要验证节点的签名,从而实现证书的验证和签名。
后面,我们会介绍如何对 ChannelMSP 进行配置,毫无疑问,这肯定也离不开配置~
转自知乎 苏小乐 :https://www.zhihu.com/people/shan-de-ding-zhu/activities