Membership Service Providers (MSP)html
本文将介绍有关MSPs的设置和最佳实践的详细方案。数组
Membership Service Providers (MSP)是一个旨在提供成员操做体系结构抽象的组件。安全
尤为是MSP抽象出发布和验证证书的全部加密机制、协议以及用户身份验证。MSP能够自定义身份概念,以及这些身份被管理的规则(身份验证)和认证加密(签名生成和验证)。网络
一个Hyperledger Fabric区块链网络能够由一个或多个MSPs管理。这提供了成员操做的模块化,以及跨不一样成员标准和体系结构的相互操做性。架构
在本文的其他部分中,将会详细介绍由Hyperledger Fabric支持的MSP实现的设置,并讨论了有关其使用的最佳实践。ide
MSP配置模块化
要设置MSP的一个实例,在全部的peer和orderer(启用peer和orderer签名)的本地需指定它的配置,并在channel上启用peer、orderer和客户端的身份验证,并为经过和channel中全部成员分别签名验证(鉴定)。工具
首先,为了在网络中引用MSP(例如msp一、org2和org3.divA),每一个MSP都须要指定一个名称。这个名称是被一个channel所使用的属于MSP的成员规则(配置)多是一个集团、机构或是机构部门采用的名称。这也被称为MSP标识符或MSP ID。MSP标识符必须是惟一的每一个MSP实例。例如,若是在系统channel检测时发现到两个MSP实例,那么orderer的设置将会失败。区块链
在MSP的缺省实现中,须要指定一组参数来容许身份(证书)验证和签名验证。这些参数由RFC5280推导出来,包括以下:加密
为了知足如下条件,须要使用这个MSP实例的有效身份:
有关当前MSP实现中身份验证的有效性的更多信息能够参考Hyperledger Fabric MSP Identity Validity Rules——MSP身份验证规则
除了验证相关的参数以外,为了使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),它包含六个子文件夹和一个文件:
在节点的配置文件中(用于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之间存在一对一的映射。若是选择了一种不一样的映射类型,则须要考虑如下问题:
2)一个组织有不一样的部门(好比组织下各单位),它想要授予访问不一样channel的权限
有两种方案能够实现这个目的:
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实现中,官方只支持方法(1),由于它更简单,不须要将再也不考虑的中间CA列入黑名单。
6)CAs 与 TLS CAs
须要在不一样的文件夹中声明MSP标识的根CAs和MSP TLS证书的根CAs(以及相对中间的CAs)。这是为了不不一样级别的证书之间的混淆。在MSP标识和TLS证书中重用相同的CAs是不被禁止的,可是最佳实践建议在生产中避免这种状况。