HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

本文是MSP详解的第二部分,我们通过第一部分对MSP有了初步的认识,下面我们来通过peer和order节点来对MSP做一个详细的讲解

本文会以下面的结构展开:

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 

 一,生成公私钥和证书信息

生成证书和公私钥的过程

Fabric中有两种类型的公私钥和证书,一种是给节点之间,为了通讯安全而准备的TLS证书,另一种是用户登录和权限控制的用户证书。这些证书本来应该是由CA来颁发,但是我们这里是测试环境,并没有启用CA节点,这里我们使用:cryptogen来生成这两种证书。我们生成的公私钥和证书是依据配置文件crypto-config.yaml文件来生成的。关于该文件的详细介绍,参见《HyperLedger-Fabric1.0原理-Fabric网络搭建过程之配置文件》一文,这里不再赘述。

1 cryptogen generate --config=./crypto-config.yaml

e2e_cli例子中,生成的的网络拓扑结构如下图所示。

该命令会生成一个名为crypto-config的文件夹,该文件夹是基于Fabric网络的拓扑结构而来的:

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 

 二,目录解析

生成的文件都保存到crypto-config文件夹,我们可以进入该文件夹查看生成了哪些文件:

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 

 查看当前目录下的crypto-config目录,生成ordererOrganizations和peerOrganizations两棵组织树。

以peerOrganizations为例,该目录下有两个目录org1.example.com和org2.example.com。分别对应通道中Org1和Org2的相关证书和签名。

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 

 

每个组织树下都包括ca、msp、orderers(或peers)、tlsca、users五个子目录。

 HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 

 org1.example.com表示Org1组织。

在peers目录下,有两个子目录peer0.org1.example.com和peer1.org1.example.com包含了这两个节点的msp配置信息。

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 

 接下来以org1.example.com组织树为例,每个目录和文件对应的功能讲解。

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 

 

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个子文件夹与一个文件:

  1. 文件夹admincerts包含PEM文件:每个PEM文件对应于一个管理员证书。
  2. 文件夹cacerts包含PEM文件:每个PEM文件对应于一个根CA的证书。
  3. 一个文件夹signcerts包含节点的X.509证书的PEM文件。
  4. (可选)文件夹intermediatecerts包含一些PEM文件:每个PEM文件对应于一个中间CA的证书。
  5. (可选)一个文件夹,tlscacerts以包含每个对应于TLS根CA证书的PEM文件
  6. (可选)文件夹crls包含相关CRL。
  7. 文件夹keystore包含一个PEM文件及节点的签名密钥;我们必须强调:现阶段还不支持RSA密钥。
  8. (可选)文件夹tlscacerts包含如下PEM文件:每个PEM文件对应于一个根TLS根CA的证书
  9. (可选)文件夹tlsintermediatecerts包含如下PEM文件:每个PEM文件对应于一个中间TLS CA的证书

 

在e2e_cli中,该Org1组织中的有两个节点,一个是管理员peer0,另一个是用户peer1。

这两个节点的文件路径如下:

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 

 peers文件夹下有两个文件,分别他们是peer0和peer1的本地MSP配置文件所在:

进入peer0.org1.example.com文件夹下,可以看到如下两个文件夹

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 

此时,文件的当前目录为: 

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 

 该目录即为peer0.org1节点进行msp配置的文件目录。

一般情况,存放msp配置的相关信息的文件夹可以命名为mspconfig 或者 msp。

其中,msp的文件目录结构如下所示:

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 

 这五个文件夹下分别放了Peer0节点完成证书与签名认证所需要的相关文件。

至此,完成了Peer&Orderer配置MSP的第一步了。

第二步详细过程

第一步的主要目的,是准备相关的证书和签名。第二步,就是要将这些文件路径配置到Peer | Orderer的配置文件中。这样,在启动节点时,就能够找到相应的证书和签名进行认证。

在节点的配置文件中,

peer对应的是core.yaml文件;

orderer对应的是orderer.yaml。

我们需要在这些配置文件中指定mspconfig文件夹的路径和节点MSP的MSP标识符。

那么到底如何来指定呢?

下面将逐一讲解:

1>peer节点配置

当Peer节点作为服务端启动时,会按照优先级从高到低的顺序依次尝试从命令行参数、环境变量或配置文件中读取配置信息。这里,我们主要通过配置文件的方式来对Peer进行配置。

读取配置信息的顺序

  1. Peer节点默认的配置文件读取路径为$FABRIC_CFG_PATH/core.yaml;
  2. 如果没找到,则尝试查找当前目录下的./core.yaml文件;
  3. 如果还没有找到,则尝试查找默认的/etc/hyperledger/fabric/core.yaml文件。

在结构上,core.yaml文件中一般包括logging、peer、vm、chaincode、ledger五大部分,其中,与MSP配置相关的主要是peer部分。下面见介绍如何对Peer部分进行配置,实现MSP。

peer部分包括了许多跟服务直接相关的核心配置,内容也比较多,包括msp配置、gossip、events、tls等多个配置部分,如下图所示:

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 下面将着重介绍通用配置中的MSP配置:

打开core.yaml文件,以下部分是关于MSP的配置

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 

配置------>·mspConfigPath:

MSP目录所在的路径,可以为绝对路径,或相对配置目录的路径,一般建议为/etc/hyperledger/fabric/msp;本例中,写的是相对路径msp

配置------->localMspId:

Peer所关联的MSP的ID,一般为组织单位名称,需要与联盟配置中的名称一致;

到这里,就已经完成了对Peer节点的LocalMSP配置。

2>Orderer节点配置

orderer节点对应的配置文件是orderer.yaml。

Orderer节点可以组成集群来在Fabric网络中提供排序服务。类似地,支持从命令行参数、环境变量或配置文件中读取配置信息。

当从环境变量中读入配置时,需要以ORDERER_前缀开头,例如配置文件中的general.ListenAddress项,对应到环境变量ORDERER_GENERAL_LISTENADDRESS。

在结构上,orderer.yaml文件中一般包括General、FileLedger、RAMLedger、Kafka四大部分,其中,涉及MSP配置的部分在General。General部分的配置如下所示:

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 其中,LocalMSPDir,LocalMSPID为配置本地msp的主要部分。进入该orderer.yaml文件,该部分如下图所示:

HyperLedger-Fabric原理-MSP详解-Peer&Orderer配置MSP

 

 配置------>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节点和排序服务节点就有了签名证书,在通道节点之间传输数据时,要验证节点的签名,从而实现证书的验证和签名。

 

 

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   # 用户的身份私钥用来签名。
上一篇:MySQL中int(m)的含义


下一篇:Hyperledger fabric的项目实战---江苏省农牧厅渔业管理系统代码实现