成员服务提供者(MSP)是一个为超级账本提供成员管理服务的组件。Msp抽象出了发行证书,验证证书,身份认证背后的加密机制和协议。一个MSP可以定义自身,以及验证与签名规则。
一个Hyperledger Fabric区块链网络可以被一个或多个MSP管理。并提供了模块化的成员操作,以及兼容不同成员标准与架构之间的操作。
接下来我们将详细说明MSP的实现步骤,以及最佳实践。
MSP配置
首先需要为MSP命名( MSP ID),以便在网络中使用 (例如 msp1、org2、org3.divA)。这个被命名的MSP可以代表在网络中的联盟、组织和组织分工。 在同一网络中MSP ID必须唯一,否则网络启动会失败。
MSP的默认实现,需要指定一组参数来进行身份(证书)验证与签名验证。这些参数来自RFC5280,具体包括:
1. 一组根证书以构成信任源
2. 一组中级证书,用于证书的校验。这些证书应该被信任源的一个证书所认证;此参数可选。
3. 一组可信任的X.509证书列表,以表示该MSP的管理员。管理员可以更改MSP的配置(例如根CA,中间CA)
4. 一组组织单元列表。此参数可选。例如:使用相同根证书和中级证书的多个组织,会为它们的成员设置OU字段。
5. 一组由根证书或中级证书所发布的证书吊销列表;此参数可选。
6. 一组根证书列表(满足X.509标准)以构成TLS信任源,服务于TLS证书
7. 一组中级TLS证书列表;此参数可选。
有效的MSP实例满足以下条件:
1. 它们应符合X.509证书标准,且具有一条可验证的路径(该路径通往根证书);
2. 它们没有包含在任何CRL中;
3. 它们在证书的OU字段中设置一个或多个MSP配置的组织单元;
关于当前MSP实现过程中身份验证的更多信息,我们推荐各位读者阅读MSP Identity Validity Rules
除了验证相关参数,节点使用MSP来签名和认证, 需要指定:
1. 用于节点签名的签名密钥(目前只支持ECDSA密钥);
2. 节点的X.509证书,对MSP验证参数机制而言是一个有效的身份 ;
值得注意的是,MSP身份永远不会过期;它们只能通过添加到合适的CRL上来被撤销。此外,现阶段不支持吊销TLS证书。
如何创建MSP所需证书和签名KEY
1. 要想生成满足MSP配置的X.509证书,应用程序可以使用Openssl。我们必须强调:在Hyperledger Fabric中,不支持包括RSA密钥在内的证书。
2. 另一个选择是使用cryptogen工具,其操作方法详见快速入门章节。
3. Hyperledger Fabric CA也可用于生成配置MSP所需的密钥及证书。
在Peer和Orderer节点里启用MSP
A. 要想(为peer节点或orderer节点)建立本地MSP,管理员应创建一个文件夹(如$MY_PATH/mspconfig)并在其下包含6个子文件夹与一个文件:
1. 文件夹admincerts包含如下PEM文件:每个PEM文件对应于一个管理员证书
2. 文件夹cacerts包含如下PEM文件:每个PEM文件对应于一个根CA的证书
3. (可选)文件夹intermediatecerts包含如下PEM文件:每个PEM文件对应于一个中级证书
4. (可选)一个用于支持组织单元和成员分组的config.yaml文件。
5. (可选)文件夹crls包含相关CRL
6. 一个keysotre文件夹保存了该节点签名所用的key ;我们必须强调:现阶段还不支持RSA密钥
7. 一个signcerts文件夹保存了该节点的证书。
8.(可选)文件夹tlscacerts包含如下PEM文件:每个PEM文件对应于一个根TLS 证书。
9. (可选)文件夹tlsintermediatecerts包含如下PEM文件:每个PEM文件对应于一个中级TLS 证书。
B. 在节点的配置文件中 (peer节点使用core.yaml ,orderer节点使用 orderer.yaml),需要指定到mspconfig文件夹的路径,以及节点的MSP ID 。在peer里使用mspConfigPath字段,在orderer里使用LocalMSPDir字段指定mspconfig文件夹的路径。该路径是FABRIC_CFG_PATH环境变量的相对路径。在peer节点的localMspId,orderer节点的LocalMSPID设置MSP ID。 也可以使用 环境变量CORE_PEER_LOCALMSPID(peer),ORDERER_GENERAL_LOCALMSPID(orderer)来设置 。对于orderer节点,还需要为system channel(系统通道)生成genesis block (创世区块) 。
组织单元
在config.yaml文件中配置组织单元信息。例如:
OrganizationalUnitIdentifiers:
- Certificate:"cacerts/cacert1.pem"
OrganizationalUnitIdentifier:"commercial"
- Certificate:"cacerts/cacert2.pem"
OrganizationalUnitIdentifier:"administrators"
在上面这个例子中,我们配置了两个组织commercial和administrators。Certificate字段 设置了 根证书或者中级证书的路径 。
成员分组
MSP可以通过设置证书的OU字段,进一步把节点分为client节点和peer节点。client节点用于发起事物和查询,peer节点用于背书和提交事物。同时,config.yaml需要做如下配置:
NodeOUs:
Enable:true
ClientOUIdentifier:
Certificate:"cacerts/cacert.pem"
OrganizationalUnitIdentifier:"client"
PeerOUIdentifier:
Certificate:"cacerts/cacert.pem"
OrganizationalUnitIdentifier:"peer"