Hyperledger Fabric2中文文档-Membership Service Providers(MSP)

翻译:https://hyperledger-fabric.readthedocs.io/en/latest/msp.html

本文档提供了MSP的设置和实践。MSP是一个Fabric组件,是成员操作的抽象。

特别是,MSP将颁发证书,验证证书和用户身份验证背后的所有加密机制和协议抽象出来。MSP可以定义自己的身份概念,以及管理这些身份的规则(身份验证)和身份验证(签名生成和验证)。

一个Fabric的区块链网络可以由一个或多个MSP管理。这提供了成员操作的模块化,以及不同成员标准和体系结构的互操作性。在本文档的其余部分中,我们将详细介绍由Fabric支持的MSP实现的设置,并讨论有关其使用的最佳实践。

MSP配置

要设置MSP实例,需要在每个peer和orderer方本地指定其配置(以启用peer和orderer签名),并在通道上指定其配置,一起用所有通道成员的peer,orderer,client身份验证和各自的签名验证(身份验证)。

首先,需要为每个MSP指定一个名称,以便在网络中引用该MSP(例如msp1,org2和org3.divA)。这是代表联盟,组织或组织部分的MSP的成员规则在通道中引用的名称。这也被成为MSP标示符或MSP ID。每个MSP实例都要求MSP标识符是唯一的。例如,如果在系统通道中检测到两个具有相同标示符的MSP实例,则orderer设置将失败。

在默认的MSP实现的情况下,需要指定一组参数以允许身份(证书)验证和签名验证。这些参数由RFC5280推导,包括:

  • 构成信任根的自签名(X.509)CA证书列表
  • 一个X.509证书的列表,用于表示此提供程序为证书验证而考虑的中间CA;这些证书应该正好由信任根中的而一个证书进行验证;中间CA是可选参数。
  • 一个X.509证书的列表,该列表代表此MSP的管理员,具有可验证的证书路径,正好指向信任根的其中一个CA证书;证书的所有者有权对此MSP配置进行更改(例如,根CA,中间CA)
  • 本MSP有效成员应在其X.509证书中包含的组织单位列表;这是一个可选的配置参数,当多个组织利用相同的信任根和中间CA,并为其成员保留一个OU字段时使用。
  • 证书吊销列表的列表(CRL),每个列表对应于所列出的(中间或根)MSP证书颁发机构中的一个;这是一个可选参数。
  • 构成TLS证书的TLS信任根的自签名(X.509)证书的列表。
  • 表示此提供程序考虑的中间TLS CA的X.509证书列表;这些证书应该由TLS信任根中的一个证书进行认证;中间CA是可选参数。

此MSP实例的有效标识必须满足以下条件:

  • 它们以X.509 证书的形式存在,证书路径可验证,正好指向信任证书的根之一;
  • 它们不包含在任何CRL(证书吊销列表 )中;
  • 它们在X.509证书结构的OU字段中列出了MSP配置的一个或多个组织单元。

有关当前MSP实现中标识有效性的更多信息,参阅MSP Identity Validity Rules

除了与验证相关的参数外,要使MSP能够对其实例化的节点进行签名或验证,还需要指定:

  • 节点用于签名的签名秘钥(当前仅支持ECDSA秘钥)
  • 节点的X.509证书,即在此MSP的验证参数下的有效标识。

需要注意的是,MSP身份永远不会过期;只有将它们添加到相应的CRL中,才能撤销它们。此外,目前不支持强制吊销TLS证书。

如何生成MSP证书和其签名秘钥

Openssl可用于生成X.509证书和秘钥。注意Hyperledger Fabric不支持RSA秘钥和证书。

或者,可以按照 Getting Started 来使用cryptogen工具。

Fabric CA还可用于生成配置MSP所需的秘钥和证书。

MSP在peer和orderer上的安装

要设置本地MSP(对peer或orderer),管理员应该创建包含六个子文件夹和一个文件的文件夹(例如 $MY_PATH/mspconfig)

1.包含PEM文件的文件夹admincerts ,每个文件对应一个管理员证书。

2.一个包含PEM文件的文件夹cacert,每个文件对应与根CA的证书。

3.(可选)intermediatecerts文件夹包含每个对应与中间CA证书的PEM文件

4.(可选)文件config.yaml配置支持的组织单位和身份分类(请参阅下面的相应部分)。

5.(可选)文件夹crls包含所考虑的CRL

6.文件夹keystore 包含一个带有节点签名秘钥的PEM文件;我们强调目前不支持RSA秘钥。

7.文件夹signcerts ,包含一个PEM文件和节点的X.509证书。

8.(可选)文件夹tlscacerts ,包含对应于TLS根CA证书的PEM文件

9.(可选)文件夹tlsintermediatecerts ,包含与中间TLS CA证书相对应的PEM文件

在节点的配置文件中(peer的core.yaml和orderer的orderer.yaml),需要指定mspconfig的目录路径,以及节点MSP的标示符。mspconfig文件夹的路径应于FABRIC_CFG_PATH相对,也就是peer的mspConfigPath 参数,orderer的LocalMSPDir 参数。节点的标识参数在peer中是localMspId ,在orderer中是LocalMSPID 。这个变量可以被环境变量更改,peer是CORE_PEER_LOCALMSPID,orderer是ORDERER_GENERAL_LOCALMSPID。注意,对于orderer的设置,需要生成,且提供系统通道创始区块。需要这个区块的MSP配置会在下个部分详细介绍。

只能手动配置“local” MSP,并且需要peer和orderer进程重启。在随后的版本中,我们的目标是提供在线/动态重新配置(即不需要使用节点管理的系统链码来停止节点)。

组织单位

为了配置此MSP的有效成员应包含在其X.509证书中的组织单位列表,config.yaml文件需要指定组织单位(简称OU)标示符。示例如下:

OrganizationalUnitIdentifiers:
  - Certificate: "cacerts/cacert1.pem"
    OrganizationalUnitIdentifier: "commercial"
  - Certificate: "cacerts/cacert2.pem"
    OrganizationalUnitIdentifier: "administrators"

以上示例声明了两个组织单元标识:commercial 和administrators。如果MSP标识包含至少一个组织单位标示符,则该标识有效。证书字段指的是CA或中间CA证书路径,在该路径下标识,有特定的OU,应该被验证。路径是相对与MSP根文件的且不能为空。

身份分类

默认的MSP组件基于OU的x509证书将组织分为client,admin,peer和orderer基于OU的x509证书。

  • 如果能在网上做交易,身份就是client
  • 如果做一些admin的任务,如加入一个peer或者升级通道配置,一个身份应该被归为admin
  • 如果为交易背书或提交交易,身份是peer
  • 如果属于ordering节点,那就是orderer

为了定义给定的MSP的client,admin,peer,和orderer,config.yaml文件需要配置适当。下面示例config.yaml的NodeOU 部分:

NodeOUs:
  Enable: true
  # For each identity classification that you would like to utilize, specify
  # an OU identifier.
  # You can optionally configure that the OU identifier must be issued by a specific CA
  # or intermediate certificate from your organization. However, it is typical to NOT
  # configure a specific Certificate. By not configuring a specific Certificate, you will be
  # able to add other CA or intermediate certs later, without having to reissue all credentials.
  # For this reason, the sample below comments out the Certificate field.
  ClientOUIdentifier:
    # Certificate: "cacerts/cacert.pem"
    OrganizationalUnitIdentifier: "client"
  AdminOUIdentifier:
    # Certificate: "cacerts/cacert.pem"
    OrganizationalUnitIdentifier: "admin"
  PeerOUIdentifier:
    # Certificate: "cacerts/cacert.pem"
    OrganizationalUnitIdentifier: "peer"
  OrdererOUIdentifier:
    # Certificate: "cacerts/cacert.pem"
    OrganizationalUnitIdentifier: "orderer"

当NodeOUs.Enable为true时,身份分类启用。然后,通过client(admin,peer,orderer)组织单元标识通过属性NodeOUs.ClientOUIdentifier (NodeOUs.AdminOUIdentifierNodeOUs.PeerOUIdentifierNodeOUs.OrdererOUIdentifier)设置。

a.OrganizationalUnitIdentifier:x509证书需要包含的OU值,才能将其视为client(admin,peer,orderer)。如果此字段为空,则不应用分类。

b. Certificate:(可选)将其设置为CA或中间CA证书的路径,在该证书下应验证客户端(peer,admin,orderer)身份。该字段是相对于MSP根文件夹的。只有一个单独的证书可以指定。如果不设置此项,那就在组织的MSP配置中定义的任何CA下验证身份,如果将来需要添加其他CA或中间证书,这可能是理想的。

注意如果NodeOUs.ClientOUIdentifier(NodeOUs.AdminOUIdentifierNodeOUs.PeerOUIdentifierNodeOUs.OrdererOUIdentifier)缺失,分类就不支持。如果NodeOUs.Enable设置成true,并且没有类型key被定义,那么身份分类就被假设为禁用。

身份可以使用组织单元来分类为client,admin,peer,orderer。这四类身份是相互排斥的。1.1版本在分类为client和peer之前需要启用通道capability ,1.4.3版本在分类为admin和orderer之前,需要启用通道capability 。

分类允许将身份分类为管理员,而无需将证书存储在MSP的admincerts文件夹中。相反,admincerts 文件可以一直为空,并且可以通过向OU注册标识来创建。admincerts文件夹中的证书仍将向其持有者授予管理员角色,前提是他们拥有客户端或管理OU。

通道MSP设置

在系统产生时,需要指定网络中出现的所有msp的验证参数,并包含系统的创始区块。回想以下,MSP验证参数包括MSP标示符、信任证书的根、中间CA和管理证书,以及OU规范和CRL。系统创始区块在orderer的设置阶段提供给他们,并允许他们验证通道创建请求。如果系统genesis块包含两个具有相同标识的MSP,那么orderer将拒绝系统创始区块,因此网络的引导将失败。

对于应用程序通道,只有管理通道的msp的验证组件需要驻留在通道的创始区块中。我们强调,应用程序有责任在指示一个或多个peer加入通道之前,确保通道的创始区块(或最新的配置块)中包含正确的MSP配置信息。

在使用configtxgen工具引导通道时,可以通过在mspconfig文件夹中包含MSP的验证参数并在其中的相关部分设置该路径来配置通道MSP的configtx.yaml

重新配置通道上的MSP,包括与该MSP的ca相关联的证书吊销列表通知,是通过MSP的一个管理员证书的所有者创建config_update 对象来实现的。然后,由管理员管理的客户端应用程序将向显示此MSP的频道宣布此更新。

最佳实践

这部分,我们将详细介绍常见场景中MSP配置的最佳实践。

1)组织、公司和MSP之间的映射。

我们建议在组织和MSP之间建立一一对应的关系。如果选择不同类型的映射,则需要考虑以下几点:

  • 一个组织雇佣不同的MSP。这对应于一个组织的情况,包括各种部门,每个部门由其MSP代表,或者出于管理独立性的原因,或者处于隐私的原因。在这种情况下,一个peer只能由一个MSP拥有,并且不会识别同一个组织有不同MSP的peer。这意味着peer可以通过gossip与同属于一细分的一组peer共享数据,而不是与组成实际组织的全套提供者共享数据。
  • 多个组织共用一个MSP。这对应于一个由成员们管理的联盟,这里需要知道的是,peer会将组织范围内的消息传播给同一MSP下具有标识的peer,而不管它们是否属于同一个实际组织。这是对于MSP定义颗粒度和peer的配置的限制。

2)一个组织有不同的部门(或组织单元),它想授予不同的通道访问权限。

两种方式来处理这种情况:

  • 定义一个MSP以容纳所有组织成员的资格。MSP的配置将包括根ca,中间ca和管理证书的列表;成员身份将包括成员所属的组织单元(OU)。然后,可以定义策略来捕获特定角色的成员(应该是:peer,admin,client,order,member之一),这些策略可以构成频道的读/写策略或链码的认可策略。在configtx.yaml 的profile部分指定OU为未配置。这种方法的一个局限性是,gossip peer会认为其笨的MSP下具有成员身份的peer视为同一组织的成员,并因此与他们沟通组织范围内的数据(例如他们的状态)
  • 为每一个部门来定义MSP。这将涉及为每个部门指定根CA,中间CA和管理证书的一组证书,以便在MSP之间没有重叠的证书路径。这意味着,例如,每个细分使用不同的中间CA.这里的缺点是管理多个msp而不是一个msp,但是这回避了前面方法中存在的问题。这可以通过利用MSP配置的OU扩展为每个部门定义一个MSP.

3)将client与同一组织的peer分离。

在许多情况下,需要从身份本身检索身份的“类型”(例如,可能需要保证背书是由peer而不是仅作为orderer的client或节点派生的)。

对这种要求的支持有限。

允许这种分离的一种方法是为每种节点类型创建一个单独的中间CA——一个用于client,一个用于peer/orderer;并配置两个不同的MSP——一个用于客户端,一个用于peer/orderer。该组织应该访问的通道将需要包括两个MSP,而背书策略将只利用引用peer的MSP。这最终会导致组织被映射到两个MSP实例,并且会对peer和client交互方式产生一定的影响。

Gossip不会收到剧烈影响,因为同一组织的所有peer依然属于同一个MSP。Peer可以将某些系统链码的执行限制为基于本地MSP的策略。例如,peer可以执行joinChannel请求,如果请求是由只能是client的本地MSP管理员签名的。如果我们接受作为peer/orderer的MSP的唯一客户机是该MSP的管理员,我们就可以避免这种不一致。

使用这种方法需要考虑的另一点是,peer根据本地MSP中请求发起方的成员身份来授权事件注册请求。显然,由于请求的发起者是client,因此请求发起者总被认为属于被请求peer不同的MSP,并且peer将拒绝该请求。

4)管理员和CA证书

将MSP管理员证书设置为不同的信任根或中间ca的证书,这一点很重要。这是一种常见的(安全)做法,将管理成员组成部分的职责与颁发新证书和/或验证现有证书分开。

5)阻止中间CA

前文提到,重新配置MSP是通过重新构造结构实现的(手动重新配置本地MSP实例,并通过为通道MSP实例正确构造配置config_update )。显然,有两种方法可以确保MSP中考虑的中间CA不再用于该MSP的身份验证:

1.重新配置MSP,使其不再将该中间CA的证书包含在受信任的中间CA证书列表中。对于本地配置的MSP,这意味着将从intermediatecerts文件夹中删除此CA的证书。

2.重新配置MSP以包含由trust根生成的CRL,该CRL将公开所述中间CA的证书。

在当前的MSP实现中,我们只支持方法(1),因为它更简单,不需要打包丢弃的中间CA。

6)CA和TLS CA

MSP标识的根CA和MSP TLS证书的根CA(以及相对中间CA)需要在不同的文件夹中声明。这是为了避免不同类别证书之间的混淆。不禁止对MSP标识和TLS证书中用相同的ca,但最佳实践建议在生产中避免这种情况。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值