Hyperledger Fabric Membership Service Providers (MSP)——成员服务
Membership Service Providers (MSP)
本文将介绍有关MSPs的设置和最佳实践的详细方案。
Membership Service Providers (MSP)是一个旨在提供成员操作体系结构抽象的组件。
尤其是MSP抽象出发布和验证证书的所有加密机制、协议以及用户身份验证。MSP可以自定义身份概念,以及这些身份被管理的规则(身份验证)和认证加密(签名生成和验证)。
一个Hyperledger Fabric区块链网络可以由一个或多个MSPs管理。这提供了成员操作的模块化,以及跨不同成员标准和体系结构的相互操作性。
在本文的其余部分中,将会详细介绍由Hyperledger Fabric支持的MSP实现的设置,并讨论了有关其使用的最佳实践。
MSP配置
要设置MSP的一个实例,在所有的peer和orderer(启用peer和orderer签名)的本地需指定它的配置,并在channel上启用peer、orderer和客户端的身份验证,并为通过和channel中所有成员分别签名验证(鉴定)。
首先,为了在网络中引用MSP(例如msp1、org2和org3.divA),每个MSP都需要指定一个名称。这个名称是被一个channel所使用的属于MSP的成员规则(配置)可能是一个集团、机构或是机构部门采用的名称。这也被称为MSP标识符或MSP ID。MSP标识符必须是唯一的每个MSP实例。例如,如果在系统channel检测时发现到两个MSP实例,那么orderer的设置将会失败。
在MSP的缺省实现中,需要指定一组参数来允许身份(证书)验证和签名验证。这些参数由RFC5280推导出来,包括如下:
- 一个自签署的(X.509)证书列表来构成信任的根
- 把一个表示为中间CAs的X.509证书列表作为提供者的证书验证;这些证书应当由信任的根证书中的一个证书进行认证;中间CAs是可选参数
- 一个(X.509)证书的列表和授信的根证书集的证书路径作为MPS的管理员,这些证书的所有者被授权请求对MSP配置进行更改(例如,根ca,中间CAs)
- 这个MSP的有效成员应该包含在他们的X.509证书中,这是一个可选的配置参数,例如用在多个组织使用相同的信任根和中间CAs,并为其成员预留了一个OU( Organizational Units/组织单元)字段。.
- 证书撤销列表集(CRLs——certificate revocation lists)中的每一个列表都对应一个列出的(中间或者根)MSP证书颁发机构;这是一个可选参数
- 一个自签署的(X.509)证书列表构成了授信TLS证书的TLS根
- 提供者考虑一个表示为中间TLS CAs的X.509证书列表,这些证书应该由授信的TLS根证书中的一个证书进行认证,中间CAs是可选参数
为了满足以下条件,需要使用这个MSP实例的有效身份:
- 它们以证书的形式存在,并具有可验证的证书路径,以完全信任证书的根
- 不包括在任何证书撤销列表(CRLs——certificate revocation lists)中
- 在证书结构的OU( Organizational Units/组织单元)字段中列出了MSP配置的一个或多个组织单元
除了验证相关的参数之外,为了使MSP能够在实例化的节点上进行签名或验证,还需要做出如下指定:
- 用于在节点上签署的签名键(目前仅支持ECDSA键)
- 节点的X.509证书,在MSP的验证参数下是一个有效的身份
重要的是要注意到MSP的身份永远不会过期;只有将它们添加到相应的证书撤销列表(CRLs——certificate revocation lists)中才能撤销它们。此外,目前还没有对强制撤销TLS证书的支持
如何生成MSP证书及其签名密钥?
为了生成用于提供其MSP配置的X.509证书,应用程序可以使用Openssl。在Hyperledger Fabric中没有包括对RSA密钥在内的证书的支持。
另一种方法是使用密码工具(cryptogen tool),在Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群生产部署详细介绍了如何使用该工具生成证书配置文件
还可以使用Hyperledger Fabric CA来生成配置MSP所需的密钥和证书
MSP设置peer和orderer
若想要设置一个本地MSP(peer或是排序节点),管理员应该创建一个文件夹(例如$mypath/mspconfig),它包含六个子文件夹和一个文件:
- 一个admincerts文件夹,其中包含每个对应于管理员证书的PEM文件
- 一个cacerts文件夹,其中包含了每个对应于根CA证书的PEM文件
- 一个intermediatecerts文件夹(可选),其中包含对应每个中间CA的证书的PEM文件
- 一个config.yaml文件(可选),其中配置了所有的OUs(组织单元)信息,OUs也就是yaml文件中定义的OrganizationalUnitIdentifier(组织单元ID)数组的集合,即OrganizationalUnitIdentifiers。其中需要考虑到如何证实成员们属于组织成员,证书授权配置了的证书的相对路径(例如,/cacerts/cacert.pem),并且在X.509证书的OU( Organizational Units/组织单元)字段中将出现OrganizationalUnitIdentifier代表的实际的字符串(例如“COP”)。
- 一个crls文件夹(可选),其中包含了被考虑的CRLs
- 一个keystore文件夹,其中包含了一个带有节点签名密钥的PEM文件;官方强调当前的RSA密钥不受支持
- 一个signcerts文件夹,其中包含了一个带有节点的X.509证书的PEM文件
- 一个tlscacerts文件夹(可选),其中包含了对应于每个TLS根CA证书的PEM文件
- 一个tlsintermediatecerts文件夹(可选),其中包含了对应于每个TLS中间CA证书的PEM文件
在节点的配置文件中(用于peer的core.yaml文件和orderer的orderer.yaml文件),需要指定mspconfig文件夹的路径,以及节点MSP的MSP标识符。mspconfig文件夹的路径将与 FABRIC_CFG_PATH相关联,并提供给peer中mspConfigPath参数以及orderer中LocalMSPDir参数的值。节点的MSP的标识符作为参数的值提供给peer的localMspId和orderer的LocalMSPID。这些变量可以通过当前环境使用CORE前缀赋给peer(例如:CORE_PEER_LOCALMSPID)以及使用ORDERER前缀赋给orderer(例如:ORDERER_GENERAL_LOCALMSPID)来重写。注意,对于orderer设置,需要生成,并向orderer提供系统channel的创世区块。
下面将详细介绍创世区块的MSP配置需求。
目前对于“local”MSP的重新配置只能手动进行,并且需要重新启动peer或orderer的进程。在随后的版本中,官方的目标是提供在线/动态重新配置(例如,不需要使用节点管理的系统链代码来停止节点)。
补充一点,当我们使用Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群生产部署中的方案,即生成msp中述说的第二种方案生成对应证书后,在peerOrganizations\xxx.xxx.com\peers\peer0.xxx.xxx.com\msp的目录中可以发现上述所介绍的相关目录,以此可以进一步加深本步的了解。
MSP Channel设置
在系统的生成过程中,需要指定网络中出现的所有MSPs的验证参数,并包含在系统通道的创世区块中。回看一下前文中提到MSP的验证参数包括MSP标识符、信任证书的根、中间CA和管理证书,以及OU规范和CRLs。系统创世区块在设置阶段提供给orderers,并允许他们对channel创建请求进行身份验证,如果后者包含两个带有相同标识的MSPs,那么Orderers将会拒绝系统创世区块,并因此导致网络引导失败。
对于应用程序channels,只有管理channel的MSPs的验证组件需要驻留在channel的创世区块中。官方强调,应用程序的责任是确保正确的MSP配置信息包含在一个channel的创世区块(或最近的配置块)中,在一个或多个peer加入channel之前。
当使用configtxgen工具来引导创建一个channel时,可以通过在mspconfig文件夹中包含MSP的验证参数来配置channel的MSPs,并在configtx.yaml中的相关部分设置该路径。
在channel上重新配置MSP,包括与MSP的CAs相关联的证书撤销列表的声明,这是通过MSP的一个管理员证书的所有者通过创建一个config_update对象来实现的。由admin管理的客户端应用程序将向存在此MSP的channel发布更新。
最佳实践
下文将详细介绍在常见的场景中MSP配置的最佳实践。
1)组织/公司和MSPs之间的映射
官方建议组织(organization)和MSPs之间存在一对一的映射。如果选择了一种不同的映射类型,则需要考虑以下问题:
- 一个使用各种MSPs的组织。这与一个组织的情况相对应,其中包括由其MSP所代表的各种不同的部门,或者出于管理独立的原因,或者出于隐私方面的原因。在这种情况下,一个peer只能由一个MSP拥有,并且不能识别来自其他MSPs相同组织的其他成员的身份。它的含义是,peers可以通过gossip organization-scoped的数据与一组相同细分的成员共享,而不是由构成实际组织的全部提供者组成。
- 多个组织使用一个MSP。这与一个由类似的成员架构管理联盟组织的情况相对应。这里需要知道的是,peers可以将组织范围的消息广播给在相同的MSP下具有相同身份的peers,而不管它们是否属于同一个实际的组织。这是MSP定义的粒度限制,使用and/or来配置。
2)一个组织有不同的部门(比如组织下各单位),它想要授予访问不同channel的权限
有两种方案可以实现这个目的:
- 定义一个MSP给所有组织成员提供成员身份。MSP的配置将包括一个根CAs、中间CAs和管理证书的列表,并且成员身份将包括一个成员所属的组织单位(OU),然后可以定义策略以通知特定OU的成员,这些策略可能构成一个channel的读/写策略或chaincode的背书策略。这种方法的一个局限性是,gossip peers将默认在本地MSP下所属peers的成员身份都作为同一组织成员,并且gossip peers因此也将组织范围内的数据进行散播(例如:它们的状态)。
- 定义一个MSP来表示每个部门。这将为每个涉及的指定部门设置并提供包含根CAs、中间CAs和管理员证书等一组证书,这样就没有跨MSPs的重叠认证路径,举例来说明其含义,即每个细分部门都有一个不同的中间CA。这个方案的缺点是要管理多个MSPs,而不是一个MSPs,但是这绕过了第一个方案中出现的问题。还可以通过利用MSP配置的OU扩展来为每个部门定义一个MSP。
3)将客户端从相同组织的peers中分离
在许多情况下,身份的“类型”是可以从身份本身中获取的(例如,可能需要拥有peers的派生而不是客户端或者单独的节点orderers来保证背书)。
对这些要求的背书是有限的。
允许这种分离的一种方法是为每个节点类型创建一个单独的中间CA——一个用于客户端,另一个用于peers/orderers,并配置两个不同的MSPs——一个用于客户端,另一个用于peers/orderers。该组织在访问的channel需要同时包含两个MSPs,而背书策略只会影响peers引用的MSP。
Gossip不会受到太大的影响,因为同一组织的所有peers仍然属于一个MSP。peers可以将某些系统chaincode的执行限制在本地MSP的策略中。例如,如果请求是由作为客户端(用户应该发起该请求的最终起点)的本地MSP的管理员签署的,peers才会执行“joinChannel”请求。如果我们认可仅客户端作为peer/orderer MSP的成员,也为该MSP的管理员,那么我们可以绕过这种不一致的地方。
此方法的另一个要点是,peers在本地MSP中基于请求发起者的成员资格授权事件注册请求。显然,由于请求的发起者是一个客户端,请求发起者总是注定要属于一个不同的MSP,而不是请求的peers,而peers会拒绝这个请求。
4)管理员和CA证书
设置MSP管理证书与任意一个被视为该MSP的信任根或中间CAs证书不同是很重要的。这是一种常见的(安全)实践,可以将成员组件的管理职责与新证书的颁发和/或现有证书的验证分离开来。
5)中间CA黑名单
正如前面所提到的,MSP的重新配置是通过重新配置机制实现的(本地MSP实例的手动重新配置,以及通过正确构造一个channel的MSP实例的config_update消息)。有两种方法可以确保在MSP中考虑到的中间CA不再被认为是MSP的身份验证。
- 重新配置MSP,考虑到的中间CA证书不再包括在可信的中间CA证书列表中。对于本地配置的MSP意味着该CA证书将从intermediatecerts文件夹中删除。
- 重新配置MSP,以包含由信任根产生的CRL,该CRL会对所提到的中间CA证书执行废弃。
在当前的MSP实现中,官方只支持方法(1),因为它更简单,不需要将不再考虑的中间CA列入黑名单。
6)CAs 与 TLS CAs
需要在不同的文件夹中声明MSP标识的根CAs和MSP TLS证书的根CAs(以及相对中间的CAs)。这是为了避免不同级别的证书之间的混淆。在MSP标识和TLS证书中重用相同的CAs是不被禁止的,但是最佳实践建议在生产中避免这种情况。
Hyperledger Fabric Membership Service Providers (MSP)——成员服务的更多相关文章
- Membership Service Providers (MSP)
https://blog.csdn.net/baidu_39649815/article/details/76468249 Membership service provider (MSP)是一个提供 ...
- Hyperledger Fabric Ordering Service过程
排序服务在超级账本 Fabric 网络中起到十分核心的作用.所有交易在发送给 Committer 进行验证接受之前,需要先经过排序服务进行全局排序. 在目前架构中,排序服务的功能被抽取出来,作为单独的 ...
- Hyperledger Fabric MSP Identity Validity Rules——MSP身份验证规则
MSP Identity Validity Rules——MSP身份验证规则 正如Hyperledger Fabric Membership Service Providers (MSP)——成员服务 ...
- 第6章 Hyperledger Fabric模型
This section outlines the key design features woven into Hyperledger Fabric that fulfill its promise ...
- Hyperledger fabric MSP成员管理
Hyperledger fabric 1.0 基于 PKI(Public Key Infrastructure)体系,引入了MSP模块(Membership Service Provider): 成员 ...
- Hyperledger Fabric中的Identity
Hyperledger Fabric中的Identity 什么是Identity 区块链网络中存在如下的角色:peers, orderers, client application, administ ...
- [转帖]Hyperledger Fabric 学习一:简介
Hyperledger Fabric 学习一:简介 https://www.jianshu.com/p/f971858b70f3?utm_campaign=maleskine&utm_cont ...
- Hyperledger Fabric介绍
转载地址 https://blog.csdn.net/xiaonu123/article/details/81006936 简介 Hyperledger介绍 超级账本(Hyperledger)项目是首 ...
- HyperLedger Fabric Introduction——区块链超级账本介绍
介绍 HyperLedger Fabric是一个基于模块化架构的分布式账本解决方案平台,它拥有深度加密.便捷扩展.部署灵活及可插拔等特性.它设计之初的目的是支持不同组件的可插拔实现,并适应整个经济生态 ...
随机推荐
- Android OpenGL ES 入门系列(一) --- 了解OpenGL ES的前世今生
转载请注明出处 本文出自Hansion的博客 OpenGL ES (OpenGL for Embedded Systems) 是 OpenGL 三维图形 API 的子集,针对手机.PDA和游戏主机等嵌 ...
- Sql 关于 查俩个表 第二个表用到第一个表的某一个数据
今天在写程序的时候遇到一个问题 有一个这个需求 select top 1 Name,[Address] from UserInfo;select * from shoppingAddress whe ...
- NOTIC: Invalid argument supplied for foreach()
NOTIC: [2] Invalid argument supplied for foreach() Warning: Invalid argument supplied for foreach() ...
- angular4.0单个标签不能同时使用ngFor和ngIf
这个问题估计是ng4严格了语法规范的原因. 介于这篇太短,附上图助助兴致 解决办法: <div *ngFor="表达式"> <ng-container *ngIf ...
- fastboot模式
快速启动. 在安卓手机中fastboot是一种比recovery更底层的刷机模式. fastboot是一种线刷,就是使用USB数据线连接手机的一种刷机模式. recovery是一种卡刷,就是将刷机包放 ...
- H5+Ajax+WebApi实现文件下载(进度条,多文件)
前言 踩过的坑 1.WebAPI跨域 2.Jquery ajax低版本不支持XHR 2功能 3.Jquery ajax不支持Deferred的process事件 4.IE下文件名乱码问题 功能实现 & ...
- re 模块 正则表达式
re模块(正则表达式) 一.什么是正则表达式 正则就是用一些具有特殊含义的符号组合到一起(称为正则表达式)来描述字符或者字符串的方法.或者说:正则就是用来描述一类事物的规则.(在Python中)它 ...
- Progressive Web Applications
Progressive Web Applications take advantage of new technologies to bring the best of mobile sites an ...
- Redis 数据结构与内存管理策略(上)
Redis 数据结构与内存管理策略(上) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 Redis 数据类型特点与使用场景 String.Li ...
- SpringBoot集成security
本文就SpringBoot集成Security的使用步骤做出解释说明.