一、MSP是什么
1.1 相关概念
证书:
证书是fabric权限管理的基础,采用ecdsa算法,符合X.509标准,通过CA来签发证书,每个identity或organization都可以拥有自己的身份证书。
组织:
证书遵循组织结构,通过组织实现灵活的权限管理,组织一般包含名称、ID、MSP、管理策略、anchor peer节点位置信息。
成员:
peer和client都是成员,peer提供节点服务,在跟不同组织交互的时候,同一个组织的成员节点一般被认为是同一个身份,然后代表组织进行签名。
联盟:
由多个组织组成,在联盟中,每个组织都要有自己的MSP ID
1.2 MSP(Membership Service Provider)
MSP(Membership Service Provider)是从一个从fabric CA里enroll的一个identity实体到一个organization的映射,确定如何将一个节点分配一个特定角色,并且获得适当的访问权限,抽象了颁发和验证证书(MSP向clients提供认证交易的凭证,以及向peers提供背书的凭证),以及身份验证背后的加密机制和协议。MSP是可插拔的接口,一个MSP是可以通过管理员的配置来更换或插拔,可以定义一些验证和签名的规则。Fabric可由多个MSP管理,提供模块化的成员操作,保证不同成员标准和结构的互操作性。但是同一个channel上MSP ID必须是唯一的,如果有两个相同的启动会失败。
1.3 MSP的验证元素
MSP的验证元素包括:
- MSP Identifier
- Root CAs
- Intermediate CAs
- Admin CAs
- OU List
- CRLs
二、MSP的结构
Fabric需要在每个peer、orderer、channel上指定MSP,启用这些节点的身份验证、签名验证的功能。
MSP的参数来自于RFC5280,包括:
- 自签名的X.509证书列表构成信任根,以及TLS证书的TLS信任根
- X.509证书列表,需要带有可验证的证书路径,以表示管理员的MSP,并有权请求对此MSP的配置进行更改(例如Root CA、intermediate CA)
- 中间证书由信任根中的其中一个证书精确认证
- OU列表
- CRL
MSP的身份合法条件:
- 符合X.509证书标准,提供可验证的证书
- MSP不能包含在任何CRL中
- 在其X.509证书结构的OU字段中可以设置一个或多个MSP的OU(组织单元)
MSP文件树如下:
Root CAs、Intermediate CAs是签发证书的CA的证书;
Organizational Units是可选的,默认不会生成,需要在msp目录下的config.yaml文件里定义organization;
Revoked Certificates、Administrators、TLS Root CAs、TLS Intermediate CAs同样是可选的;
Signing Certificates是节点本身的证书;
Keystore就是私钥,用于签名;
组织与MSP的映射关系
一般是在定义好了组织结构之后,再来命名MSP,这样就是比较节省资源。
一个organization可以不同的department,具有不同的功能和职责,可能在区块链网络里是属于不同channel的,一般需要建立多个MSP,来划分组织权限结构。
MSP在channel上的定义
- Local MSP:对应的是peer节点,在节点中给对应组织生成MSP。主要用来管理peer节点、orderer节点;
- Global MSP(Channel MSP):channel里所有organization共享的MSP集合 ,会把所有配置拷贝到Peer节点。主要用来管理channel资源、账本、智能合约等。
MSP的层级
MSP必须指定在某个层级上,这是由于channel MSP和Local MSP的分割造成的,用来管理组织和本地资源,层级从高到底有网络层、channel的Global MSP、Peer节点、orderer节点。层级化的MSP要求最好事先做好organization的设置。
Peer和Orderer的MSP配置
Peer和Orderer的MSP配置基本是一样的,示例如下:
# Path on the file system where peer will find MSP local configurations
mspConfigPath: msp
# Identifier of the local MSP
# ----!!!!IMPORTANT!!!-!!!IMPORTANT!!!-!!!IMPORTANT!!!!----
# Deployers need to change the value of the localMspId string.
# In particular, the name of the local MSP ID of a peer needs
# to match the name of one of the MSPs in each of the channel
# that this peer is a member of. Otherwise this peer's messages
# will not be identified as valid by other nodes.
localMspId: SampleOrg
# Type for the local MSP - by default it's of type bccsp
localMspType: bccsp
MSP的生命周期
用Fabric CA Client做enroll的时候,就会自动生成一个MSP的目录结构,也就是生成了一个MSP;
- 对于X.509的CRL:MSP的信息如果被加到CRL中,用户在做验证的时候会检查CRL,如果验证的这个人在黑名单里,就不应该有任何权限了;
- Idemix CRL:新的revoke功能,还没实现完成。
三、MSP实践
推荐一个组织对应一个MSP,逻辑非常清晰,实际中也可以1个组织对应多个MSP,或多个组织对应一个MSP。
授予不同部门访问不同channel的不同访问权限;
需要将管理者Admin的证书和CA证书分开;
可以把某个被攻击的中间CA加到黑名单,这样该CA颁发的所有证书都会失效;
推荐把CA和TLS CA负责各自的功能,不要放在一起。
四、TLS通信的证书
channel上节点间通信都是基于TLS的,以保证数据安全和可信性。
- 单向(只有服务器)
- 双向(服务器-客户端)
Peer节点既是TLS服务器又是TLS客户端
- TLS server:其他peer节点、application、客户端都会连接它
- TLS client:连接其他peer节点或orderer
TLS client的身份验证默认是关闭的,如果需要双边通信则要启用该功能。
在channel里,channel成员的root CA证书链是从config区块里读取的,然后添加到TLS客户端和服务器的Root CAs的数据结构。因此,peer与peer、peer与orderer之间的通信是无缝的。
TLS通信的握手过程如下图所示: