把Fabric系统看成由不同的逻辑结构组成。其中MSP是一个逻辑结构,主要的功能是承担权限管理。
那么,MSP是什么?它在Fabric中,又是以怎样的形式存在呢?接下来的这篇文章,将会做详细介绍。全文按照如下结构展开:
一,基本概念
MSP是Membership Service Provider的缩写,直译为成员关系服务提供者。为了更好的理解MSP,这里首先介绍MSP中的要用到的一些术语。
1>certificate 证书
证书(certificate)是Fabric中权限管理的基础。目前采用了基于ECDSA算法的非对称加密算法来生成公钥和私钥,证书格式则采用了X.509的标准规范。
Fabric中采用单独的Fabric CA项目来管理证书的生成。每一个实体、组织都可以拥有自己的身份证书,并且证书也遵循了组织结构,方便基于组织实现灵活的权限管理。
2>Member 成员
拥有网络唯一根证书的合法独立实体。
在Fabric区块链中,peer节点和app client这样的网络组件实际上就是一个Member。
在学习过程中,一度对成员与Peer之间的关系不太清楚,这里做一个总结如下:
成员 与 Peer的关系
Fabric网络提供的是联盟链服务,联盟由多个组织构成,组织中的成员提供了节点服务来维护网络,同时通过身份证书来进行权限管理。
通道概念就可以理解为一个通道(Fabric中的channel)对应一个联盟.
一个通道上可以有多个组织。每个组织(Fabric中的org)有多个成员。
也就是说,成员提供节点服务。
一个组织中的成员可以根据网络中流量的要求,提供不同数量的节点服务来满足网络中的访问量。
3>Organization 组织
组织(organization)代表一组拥有共同信任的根证书(可以为根CA证书或中间CA证书)的成员。
这些成员由于共享同样的信任根,彼此之间信任度很高,可以相互交换比较敏感的内容。同一个组织的成员节点在网络中可以被认为是同一个身份,代表组织进行签名。组织中成员可以为普通成员角色或者管理员角色,后者拥有更高的权限,可以对组织配置进行修改。
组织一般包括名称、ID、MSP信息、管理策略、认证采用的密码库类型、一组锚点节点位置等信息。通常情况下,多个组织为了进行数据沟通,可以加入到同一个通道中。
如上图所示,三家银行一共三个组织,两两加入到同一个通道中彼此进行相关数据交互,而无需担心被其他人看到。
4>Consortium 联盟
联盟由若干组织构成的集合,是联盟链场景所独有的结构形式。联盟一般用于多个组织相互合作的场景,例如某联盟中指定需要所有参与方同时对交易背书,才允许在网络中进行执行。
联盟中的组织成员会使用同一个排序服务,并且遵循相同的通道创建策略(Channel-CreationPolicy)。通道创建策略可以为ALL、MAJORITY或者ANY(默认值)。通道在创建时也必须指定所绑定的联盟信息。例如,某个联盟内可能定义必须要所有成员都同意才能创建新的通道;或者任何成员都可以自行创建新的通道。通道创建策略会成为所新建通道Application组的修改策略(mod_policy)。
在设置联盟时候,每个组织都需要指定自己的ID信息,该信息必须要跟该组织所关联的MSP ID一致。
5>MSP 成员关系服务提供者
成员服务提供者(MSP)是一个提供抽象化成员操作框架的组件。
MSP将颁发与校验证书,以及用户认证背后的所有密码学机制与协议都抽象了出来。
一个MSP可以自己定义身份,以及身份的管理(身份验证)与认证(生成与验证签名)规则。也就是说,在一个运行的fabric系统网络中有众多的参与者,MSP就是为了管理这些参与者,可以辨识验证哪些人有资格,哪些人没资格,既维护某一个参与者的权限,也维护参与者之间的关系。
为了处理网络成员身份和身份,成员服务提供者(MSP)管理用户id,并对网络中的所有参与者进行身份验证。一个Fabric区块链网络可以由一个或多个MSPs控制。这提供了成员操作的模块化,以及跨不同成员标准和体系结构的互操作性。
当MSP的成员管理规则表示一个团体,组织或组织分工时,该名称会被引用。这又被成为MSP标识符或MSP ID。对于每个MSP实例,MSP标识符都必须独一无二。关于这一点,会在后面MSP实践中详细说明。
6>MS(Member Service) 成员服务
成员服务在许可的区块链网络上认证、授权和管理身份。在peer和order中运行的成员服务的代码都会认证和授权区块链操作。它是基于PKI的MSP实现。
综上所述,成员是最基本的元素,它对应的是我们Fabric网络中的Peer节点或者Order节点或者Fabric-CA。MSP就是对这些成员进行身份的管理与验证的实现。
总结为一句话,成员关系服务提供者,给成员提供成员服务。这种服务是基于PKI的MSP实现的。
二,MSP的作用
从上面的解释中可知,MSP将颁发与校验证书,以及用户认证背后的所有密码学机制与协议都抽象了出来。
成员服务提供者(MSP)管理用户id,并对网络中的所有参与者进行身份验证。一个Fabric区块链网络可以由一个或多个MSPs控制。这提供了成员操作的模块化,以及跨不同成员标准和体系结构的互操作性。
三,MSP结构
Fabric中提出了成员服务提供者(Membership Service Provider,MSP)的概念,抽象代表了一个身份验证的实体。基于它可以实现对不同资源进行基于身份证书的权限验证。
成员服务提供者代表了用于对某个资源(成员、节点、组织等)进行身份验证的一组机制,是实现权限管理的基础。
基于MSP,资源实体可以对数据签名进行确认,网络可以对签名的身份进行验证。
通常情况下,一个组织或联盟可以对应到一个层级化的MSP。这里所谓的层级化的MSP,是指由根证书,生成中间件证书等组成的层级化的结构,从而实现不同管理员与普通成员之间的权限控制。
一个资源实体的MSP结构中往往包括签名和验证算法,以及一组符合X.509格式的证书,这些证书最后都需要追溯到同一个信任的根。
以下是一个MSP结构中常见的组成部分:
· 一组信任的根证书,是整个组织证书信任的基础,根证书可以签发中间层证书;
· MSP的管理员的身份证书,管理员可以对MSP中证书进行管理;
· 组织单元(Organizational Unit)列表(可选);
· 一组信任的中间证书,中间证书由根证书签发(可选);
· 证书撤销列表,代表被吊销的证书名单(可选)。
如果更详细一些,可以用下图来表示:
1>Root CAs | 根证书列表
此文件夹包含,由此MSP代表的组织信任的Root CA,自签名X.509证书列表。此MSP文件夹中必须至少有一个Root CA X.509证书。这是最重要的文件夹,因为它标识了所有其它证书。
2>Intermediate CAs | 中间证书列表
此文件夹包含此组织信任的Intermediate CA的X.509证书列表。每个证书都必须由MSP中的一个Root CA签署,或者由 Intermediate CA 签署。
Intermediate CA可以表示组织的不同细分或组织本身(例如,如果商业CA用于组织的身份管理)。在前一种情况下,可以使用CA层次结构中,较低的其他Intermediate CA来表示组织细分。请注意,可能有一个没有任何中间CA的功能网络,在这种情况下,此文件夹将为空。
与Root CA文件夹一样,此文件夹定义了中间证书。只有拥有了这些证书,才能被系统视为组织成员的CA。
3>Organizational Units (OUs) | 组织单元列表
可选的
4>Administrators | 管理员身份证书
该文件夹包含一个身份列表,用于定义具有该组织管理员角色的参与者。对于标准MSP类型,此列表中应该有一个或多个X.509证书。
5>Revoked Certificates | 撤销证书列表
可选的
6>KeyStore for Private Key | 私钥库
该文件夹为peer 或 orderer节点(或客户端的local MSP)的local MSP定义,并包含节点的signing key(签名密钥)。 此密钥用于签署数据,作为认可阶段的一部分。
该文件夹对Local MSP是必须的,并且必须包含一个私钥。 很明显,访问这个文件夹,只能由,对此peer有管理权限的用户。
Channel MSP的配置不包括此部分,因为Channel MSP旨在提供纯粹的身份验证功能,而不是签署能力。
7>TLS Root CA | TLS根证书列表
此文件夹包含,此组织为TLS通信所信任的Root CA的自签名X.509证书列表。 TLS通信的一个例子是,peer需要连接到orderer以便它可以接收ledger更新。
MSP TLS信息涉及网络内的节点,即对peers 和 the orderers,此文件夹中必须至少有一个TLS Root CA X.509证书。
8>TLS Intermediate CA | TLS中间证书
此文件夹包含由此MSP代表的,组织信任的用于TLS通信的Intermediate CA证书列表。当商业CA用于组织的TLS证书时,此文件夹特别有用。 它是可选的。
Fabric中MSP相关实现代码都在msp目录下,目前采用了bccspmsp结构来代表一个成员身份结构,并且采用了MSPConfig(主要是其成员FabricMSPConfig)结构来代表跟该实体相关的证书信息。
MSP中各实体资源的证书必须被证书信任树上的叶子节点签名。中间层签名的证书会被认为是非法实体证书。
四,MSP实践
我们讲,MSP在Fabric中的作用是对用户进行管理。那么,它是怎么实现用户管理与权限认证的呢?
第一,生成相关的证书和签名。
第二,在Peer,Orderer,Channel等组件的配置文件设置关于msp的相关信心。
也就是说,要想初始化一个MSP实例:首先,要生成用户权限管理和签名认证的证书。然后,每一个peer节点和orderer节点,Channel等都需要在本地指定其配置。
注意channel上的全体成员均参与此过程。
在一个channel中,当MSP的成员管理规则表示一个团体,组织或组织分工时,该名称会被引用。这又被成为MSP标识符或MSP ID。对于每个MSP实例,MSP标识符都必须独一无二。举个例子:系统channel创建时如果检测到两个MSP有相同的标识符,那么orderer节点的启动将以失败告终。
在实际的操作中如下:
1. 编写crypto-config.yaml配置文件指定网络的拓扑结构和组织结构。
2. cryptogen-生成秘钥和证书文件。
快速地根据配置自动批量生成所需要的密钥和证书文件。
3. 编写依赖配置文件configtx.yaml。
该文件包含网络的定义,并给出了网络组件的每个网络实体的加密材料的存储位置。
4. configtxgen-生成通道配置。
在这个过程中,会生成系统channel的创世纪块。该创世纪块(genesis block)中包含所有MSP的验证元素。回忆一下,MSP验证元素有MSP身份标识(MSP identifier),root CAs,intermediate CAs,admin CAs,OU List,CRLs。
5. 在Peer节点和Order节点配置MSP相关的信息。
具体步骤会在后面“Fabric配置管理”中仔细讲解。
下面,对步骤1进行简单的说明:
使用cryptogen生成所需文件的命令:
cryptogen generate --config $GOPATH/src/github.com/hyperledger/fabric/examples/e2e_cli/crypto-config.yaml --output crypto-config
上述命令解释如下:
·generate[flags]:生成密钥和证书文件;
其中,generate子命令支持如下参数:
·--output:指定存放生成密钥和证书文件的路径,默认为当前目录下的crypto-config目录;
·--config:指定所采用的配置模板文件的路径。
为了实现对Peer,Orderer以及Channel的管理,在搭建网络的过程中,我们只需要在它们的配置文件中,配置好相关的证书即可。
拿Peer配置为例:
mspConfigPath:MSP目录所在的路径,可以为绝对路径,或相对配置目录的路径,一般建议为/etc/hyperledger/fabric/msp;
localMspId关联Peer所关联的MSP的ID,一般为组织单位名称,需要与联盟配置中的名称一致。