只看代码而不读文档,无论是对自己的理解,还是对文章的释明,都容易使之存在困惑之处。因此在此先写fabric官方文档中几个相关主题的译文,作为自己相关主题文章的预热。水平有限,尽量直译,生硬之处很多,错误之处估计也不少而不自知。译文中括号内若是中文,则为解释,若为英文,则是专用名词。
个人觉得fabric的官方文档不好:
文档用语不简。作为说明性文档,个人认为语言应该尽量简明短小,以陈述句为主。而现在的官方文档中,充斥着大量长句,定状语句和指代名词。如果英语水平不高,比如我,读起来相当费劲且容易理解错。在此吐槽一下。
以下是Fabric文档中与MSP相关的主题译文:
Fabric加固了一个所有参与者都有一个明确身份的交易网络,并以此网络为基础。公匙基础设施(PKI,Public Key Infrastructure)被用来生成加密证书(cryptographic certificates),这些被试用于组织、网络的构成、终端用户或客户端的应用。结果,数据权限控制可以在广域网络(broader network)和层级频道(channel levels)被操作和支配。这个fabric的“授权”的概念,与channel的存在与能力相配对,帮助实现了隐私和机密为主要考虑的地址方案(address scenarios)
看Membership Service Providers (MSP)主题去更好的理解加密操作,签名,校验,认证(cryptographic implementations, and the sign, verify, authenticate)在fabric中的应用。
该文档着力于提供关于MSP的安装,最好的实践的细节。
MSP是一个着眼于提供一个会员关系操作构架的抽象,作为系统的一个组成部分。
特别的,MSP抽象了所有加密机制和协议,隐藏了存在的争论(issuing)、验证证书和用户认证。一个MSP可能定义它自己的一套身份标识,验证规则,签名的生成和认证方法。
fabric区域链网络可能会被一个或多个MSP管理,他们提供了模块化的会员操作和在不同的会员关系标准和构架间协同工作的能力。
下面的文章我们详细的介绍MSP的操作体系,并讨论最好的MSP的相关用途的练习。
为了启动一个MSP,它的配置文件必须在每个peer和orderer(去使能peer并排序签名)的本地中被指定,开启频道上的peer,orderer,客户端的身份认证,所有会员各自的签名认证。
首先,MSP需要指定一个名字在网络中代表自己,如msp1,org2等。这个名字在其会员关系规则中代表一个channel中的一个共同体、组织或者组织分部。也被引用作为MSP对象的ID(MSP Identifier)。每个MSP的ID是唯一的。例如,若检测出来存在两个相同ID的MSP实例存在于系统初创的channel,orderer将会启动失败。
MSP的默认操作的情况下,一个参数集合需要被指定(也就是一个MSP需要哪些成员),用于身份认证(identity (certificate) validation)和签名认证(signature verification)。这些参数由RFC5280指定,包括:
对于一个MSP对象实例来说,有效的身份需要满足以下条件:
* X.509格式的证书,并包含可验证的证书所在路径,该路径对应到root CAs。
* 不包括在任何一个CRL中。
* 在X.509格式的证书结构体中的OU字段里,存在一个或多个属于OU List的组织单位。
更多的MSP身份的有效性的信息,请阅读MSP Identity Validity Rules。
除了验证相关参数,对于MSP来说,使结点能够去签名或授权,你需要指定:
需要重点注意的是,MSP中的身份信息永不消失,只能被加入到CRLs中。此外,当前不支持强制废除TLS的证书。
为了生成X.509证书去填MSP的配置,应用我们可以使用openssl。我们强调一下,fabric不支持证书中包含RSA keys。
替代的,我们可以使用cryptogen tool,在Getting Started中有详述。
Hyperledger Fabric CA这个项目也可以用来生成MSP配置所需的keys和证书。
为了建立本地MSP(local MSP),无论是peer还是orderer上的,管理者都要创建一个目录,如$MY_PATH/mspconfig,包含六个子目录和一个文件:
1. admincerts目录,包含pem文件,每个pem文件对应一个administrator证书,即administrator CAs。
2. cacerts目录,包含每个的pem对应一个root证书,即root CAs。
3. (可选)intermediatecerts目录,对应中间人CA。
4. (可选)config.yaml文件,包含关于组织单位OU的信息。会定义如
在系统初创的时候,出现在网络中所有MSP的验证元素(即各种证书,配置)都需要被指定过(即必须已经存在),并被包含到系统channel的创世纪块(genesis block)中。回忆一下,MSP验证元素由MSP身份标识(MSP identifier),root CAs,intermediate CAs,admin CAs,OU List,CRLs。在orderer进行体系解析时,系统的创世纪块被用于orderer,据此orderer被允许去认证channel的创建请求(等于说orderer有认证的材料了,如果创建channel的请求合法才通过该请求)。如果创世纪块包含了两个相同身份标识的MSP,orderer将拒绝此块,自然的,整个网络的引导建立也会失败。
对于应用(application)的channel,其验证的各个组成部分,也就是(只能是)管理该channel的MSP,必须存在于channel的创世纪块中。我们强调,在channel创建一个或多个peer加入该channel之前,保证包含在该channel的创世纪块(或者是最新的配置块)中的MSP配置信息的正确性是应用的责任。
当在configtxgen工具(configtxgen tool)帮助下引导启动一个channel时,通过将MSP的验证元素(如root CAs,中间人CAs等)放置到MSP专用的配置目录,并在configtx.yaml文件中设置相应的选项,我们可以使用configtxgen工具配置该channel的MSP。
重新配置一个channel上的MSP,包括该MSP相关的废止证书列表(CRLs)的公告,通过该MSP中的Admin CAs中的一员(即拥有Admin CA证书的结点,也叫做admin结点)创建一个配置更新对象(config_update object),可以实现。如此之后,被admin管理的客户端应用将宣布这个针对该MSP所在的channel的更新。
在这个部分,我们将详述MSP配置在一般情况下的最好的实践(best practices)。
1)组织单位和MSP之间的映射
我们要求MSP与组织(organizations)之间是一对一的映射。如果选择一个不同的映射类型,需要考虑如下内容:
2)一个组织有不同的部门(称为组织单位-organizational units),针对其中的一个想给予多个不同channel访问权限
两种方法:
3)从同一个组织中的众多peer中分离客户端
在很多情况下,可以从身份自身获取身份的类型是需要的(如背书被担保是由peer这种类型的结点产生,而不是客户端或扮演orderer的结点)
以下是对该需求的有限的支持。
一种实现这种分离的方法是为每一类结点都创建一个单独的intermediate CA —— 一个客户端的,一个peer/orderer的;配置两个不同的MSP —— 一个客户端的,一个peer/orderer的。该组织应该(可以)访问的频道,需要同时包含这两个MSP,而背书策略(定义)则只使用代表peer结点的MSP。最终,将会把这个组织映射到两个MSP实例中,自然而然的peer与client可以相互作用(交流)了。
Gossip不会被大幅影响,因为同一个组织的所有peer依然属于同一个MSP。peer们结点可以限制某些系统chaincode的运行到本地的基于策略的MSP。例如,peer将只会执行“joinChannel”请求,如果该请求被客户端类型的MSP(终点用户位于请求的起源处)的admin签名的话。我们可以绕开这点的前后矛盾,如果我们接受,对于peer/orderer的MSP来说,客户端能成为该MSP成员的只能是该MSP的admin。
此种方法另一点需要考虑是,基于请求源头在它本地MSP中所处的地位,peer授权事件注册请求。很明显,因为请求源头是客户端,相较于被请求的peer,请求源头总是注定属于不同的MSP,并且被请求的peer将拒绝该请求。
4)Admin和其证书
MSP的admin证书是独一无二的,与该MSP中root CAs或者intermediate CAs中的证书都不同。这是一种通用的实践:将管理成员关系的责任从证书的验证讨论中脱离出来。
5)intermediate CA黑名单
正如前文提到的,重新配置一个MSP通过重新配置机制(对本地MSP实例手工重配,或者通过构建一个channel中MSP实例的一个配置升级消息)实现。很明显,这里有两种方法去确保一个intermediate CA被拉入黑名单:
当前的MSP操作,我们仅支持第一种方法,这种方法更简单,也不需要拉黑不信任的证书。
6)CAs和TLS CAs
MSP的root CAs与TLS的root CAs(相对于中间人CA来说)需要定义在不同的目录中。这样是为了避免在两种不同类型的证书之间产生混淆。关于这点来说,不禁止,但是最好在产品中避免。