Hyperledger Fabric-CA学习

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }

Hyperleder Fabric系统架构核心逻辑包括MemberShip、Blockchain和Chaincode

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }

其中上述3个核心逻辑中,Membership服务用来管理节点身份、隐私、confidentiality 和 auditability。在一个 non-permissioned的区块链网络里,参与者不要求授权,所有的节点被视作一样,都可以提交一个transaction,去把这些交易存到区块(blocks)中。Membership Service将一个 non-permissioned的区块链网络变成一个permissioned的区块链网络,凭借着Public Key Infrastructure (PKI)、去中心和一致性。

从上面的描述中可以看出,对于一个隐私性要求较高,节点需要授权才可以加入区块链网络并节点可能存在不同角色的区块链我那个落,Membership从中起到授权用户、加密传输数据的作用。在Fabric 1.0版本中,MemberShip Service替换成fabric-ca模块。由于CA在pemissioned区块链网络中的重要作用,Fabric也将CA作为一个单独的模块,可以独立运行,其代码可从https://github.com/hyperledger/fabric-ca获取得到。

下面的图表描述了CA
服务器在Hyperleder
Fabric框架体系架构中的工作方式:

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }
_Hyperleder Fabric系统架构核心逻辑包括MemberShip、Blockchain和Chaincode
--> { }

p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }

从表中可以看出,CA 服务器结构为树形结构,整个树形结构的根节点为根CA(Root Server),存在多个中间CA(Intermediate CA),图中每个中间CA服务器上可以配置一个CA服务集群,CA服务集群通过前置的HAproxy实现负载均衡。

Fabric CA提供了两种访问方式调用Server服务,一种是通过Client调用,另一种是通过SDK调用。两种调用都是REST风格的。本文使用的是通过Client调用。

接下来,参考fabric-ca官方文档说明要求,针对fabric-ca的请求/发放证书、注册节点等操作实践操作一遍已加深理解。

首先安装启动fabric
ca,启动fabric-ca可以通过docker和下载fabric-ca至本地启动两种方式,下文安装了fabric-ca在本地并启动:

本地启动fabric-ca的准备条件:

1、安装Go
1.7以上版本

2、正确配置了GOPATH环境变量

3、libtool和libtdhl-dev包已安装

通过运行命令:
go
get -u github.com/hyperledger/fabric-ca/cmd/...

上述命令可以安装fabric-ca-server和fabric-ca-client之$GOPATH/bin目录下

pre.ctl { font-family: "Liberation Mono", monospace }
p { margin-bottom: 0.25cm; line-height: 120% }
a:link { }

执行上述命令后,在GOPATH/bin下可以看到fabric-ca-server和fabric-ca-client已经正常启动了。

启动fabric-ca-server:

fabric-ca-server
start -b admin:adminpw

其中-b参数提供了节点登记过程的引导节点,后面登记节点时需要用到。

使用命令fabric-ca-server start -b admin:adminpw --cacount 2启动了一个包含了2个CA服务簇的CA server

启动CA server后,在服务器根目录下分别新建了一个ca1和ca2两个文件夹,启动过程中服务器首先通过ecdsa SHA256算法生成密钥,然后编码生成CSR(证书签名请求,CSR签名请求中包含了请求用户的城市、公司等基本信息),CA服务器对CSR中的基本信息通过数字签名制作数字证书并颁发给申请者。上图可以看出最终生成的CA证书最终存储在ca1和ca2文件夹下的ca-cert.pem文件里。生成数字证书后,CA服务器会将证书信息写入到数据库或LDAP目录服务器中。上图中默认存放在ca1和ca2文件夹下的sqlite3 db中。

上图为执行服务器启动后生成的目录结构,其中fabric-ca-config.yaml是启动过程中所使用的配置文件。

切换到ca1文件夹下,通过openssl命令查看证书内容:

如图可以看到,数字证书包含了签名算法信息、申请者基本信息、申请者公钥信息等。
打开存储发放证书信息的sqlite3 数据库:


可以看到数据库中有3个表,其中users表中目前只有启动时设定的引导节点,还没有注册其他节点。certificates表中目前没有任何发放证书记录。
现在我们尝试使用fabric-ca先登记引导节点,命令如下:
fabric-ca-client enroll -u http://admin:[email protected]:7054
这里admin和adminpw即为fabric-ca-server启动时设置的引导节点登记id和密码
client执行结果如下:

server端接收到登记请求:

在ca-client目录下生成的目录结构如下:

其中msp/signcerts目录下存储的为client的数字证书,cacerts目录下存储的为证书链信息。
回到ca-server目录下,打开sqlite3数据库,可以看到刚刚颁发的数字证书已经记录在数据库里了。

接下来使用fabric-ca-client注册一个新的节点,这一步就是为fabric中的peer、user角色进行注册并登记的过程了,注册的命令为:
fabric-ca-client register --id.name admin2 --id.type user --id.affiliation org1.department1 --id.attrs ‘hf.Revoker=true,foo=bar‘
这里有两点需要注意:
1、--id.type参数必须是是server端配置文件里hf.Registrar.Roles属性值里的一个
打开fabric-ca-server的配置文件

其中通过hf.Registrar.Roles的属性值可以看出,客户端可以注册的类型有client,user,peer,validator和auditor
2、--id.affiliation这个属性表示:被注册对象的从属关系参数一定要归属于预先配置的组织属性。换句话说,被注册对象的affiliation参数一定要是预先配置的affiliation参数的一个前缀。例如,假设预先配置的组织关系为:“a.b.c”,那么新注册的对象的affiliation属性可以是“a.b.c”,也可以是“a.b”,但“a.c”就不能通过注册。
执行节点注册命令后,注册了一个user结点:
client端执行结果:

这里分配的password需要记住,后面在登记该节点时会用到。
server端接收到请求

登记刚刚注册过的admin2节点,登记命令为:
fabric-ca-client enroll -u http://admin2:[email protected]:7054 -M $FABRIC_CA_CLIENT_HOME/msp
这里登记时使用的erollId和密码就是上边注册过程中的节点名称和返回的密码信息。这册过程中也是可以指定密码的。
执行登记命令,结果如下:

打开fabric-ca-server的sqlite数据库

查看用户信息,其中有一个client节点admin和一个user节点admin2。其中admin是一个intermediateCA。
打开数据库表certificates,这是可以看到给admin2所颁发的证书已经记录了。

重新登记节点,在节点授权即将到期是需要重新登记节点信息。重新登记的命令为:
fabric-ca-client reenroll

重新登记过程重新发送签名证书请求,获取新的数字证书。
打开server端数据库,可以看到两条颁发给节点admin2的证书记录,两个证书颁发的时间不一样。

注销证书,注销证书的命令为:fabric-ca-client revoke -e <enrollment_id> -r <reason>
其中reason参数可以为:
1. keycompromise
2. cacompromise
3. affiliationchange
4. superseded
5. cessationofoperation
6. certificatehold
7. removefromcrl
8. privilegewithdrawn
9. aacompromise
10. unspecified
下面我们注销掉刚刚登记的admin2节点试一下,执行命令fabric-ca-client revoke -e admin2:
执行结果如下:

打开server端数据库:
可以看出admin2节点的证书状态已经改为注销了。

注册一个中间CA,具体命令为:fabric-ca-server start -b admin1:adminpw1 -u http://admin:[email protected]:7054
上述命令重新启动了一个CA服务器,作为引导节点CA服务器下的中间CA,执行结果如下:

服务端执行结果:

打开ca-chain.pem查看刚刚登记的中间CA服务器证书链:

可以看到证书链中包含上级CA证书和自己的证书信息。
尝试在刚刚建立的CA上注册登记一个节点,注册一个节点admin2的命令同上:
首先登记节点:

fabric-ca-client register --id.name admin2 --id.type user --id.affiliation org1.department1 --id.attrs ‘hf.Revoker=true,foo=bar‘

注册的结果已经记录在数据库中:

最后登记节点,执行命令:fabric-ca-client enroll -u http://admin2:[email protected]:7055 -M $FABRIC_CA_CLIENT_HOME/msp

进入刚刚登记的节点目录,生成如下目录结构:

打开cacerts下面的证书链文件,可以看到刚刚登记的节点证书链包含两个中间CA的数字证书信息,在验证由该个树形CA服务器中一个中间CA节点所颁发的数字证书是否真实有效时,会按照证书链自下向上进行验证,直至到达根证书。

如果区块链网络中有多个链,每个链为了保证各自的隐私性存在各自的CA服务器,那么当一个用户同时拥有两个链的权限时,怎样同时具备验证两个链上的节点所拥有的CA证书呢?按照上边证书链的原则,一个节点注册登记到一个中间CA后,应该只能拥有该条CA服务器链上的证书链。这里为了解决这个问题,有一种方法是交叉认证,在fabric-ca中也有类似的操作方法,即通过Restful接口获取另外一个CA服务器上的证书链。
具体命令为:fabric-ca-client getcacert -u http://localhost:7055 -M $FABRIC_CA_CLIENT_HOME/msp
这里我们新建一个单独运行的CA服务器:

查看该根服务器的数字证书:

接下来,我们在上文登记的节点admin2上运行获取刚刚建立的CA服务器证书链命令:

执行命令结束后,查看admin2节点所对应的证书链目录:

可以看到启动在端口7056上的CA服务器所对应的证书链已经同步过来了。

Fabric-ca这个模块详细描述了CA工作过程中使用fabric-ca-client和sdk方式的方法,其中包括配置LDAP以及其他数据库的配置方法在文中也有说明,sdk方式的restful操作接口,可以查看fabric-ca源码根目录下的swagger.json文件。使用中需要根据区块链网络的特性,使用CA签发的数字证书进行认证、加密传输数据、授权用户、管理用户证书。

时间: 2024-10-23 00:50:06

Hyperledger Fabric-CA学习的相关文章

Hyperledger Fabric CA User’s Guide——概述(二)

概述 下面的图表说明了如何将Hyperledger Fabric CA与总体的Hyperledger Fabric结构相匹配. 有两种方式与一种Hyperledger Fabric CA服务器进行交互:通过Hyperledger Fabric CA的客户端或通过任意一种Fabric的SDKs.所有与Hyperledger Fabric CA服务器的通信都是通过REST api进行的.有关这些REST api的swagger文档,请参见fabric-ca/swagger/swagger-fabri

Hyperledger Fabric CA的命令行用法

介绍Hyperledger Fabric CA的命令行方式简单用法 Hyperledger Fabric CA由server和client两部分组成. 设置两个环境变量 export FABRIC_CA_SERVER_HOME=/path_to/fabric-ca/server export FABRIC_CA_CLIENT_HOME=/path_to/fabric-ca/client server的操作主要有两个: 1. 初始化Server服务 在server启动之前,需要至少有一个自我认证的

hyperledger fabric 结构模型学习

1.hyperledger fabric1.1.0 主要包含以下几个结构模型,Assets(资产),Chaincode(链码),Ledger Features(总帐功能),Privacy through Channels(渠道隐私),Security & Membership Services (安全和会员服务),Consensus(共识) 2.Assets(资产):资产可以从有形资产(房地产和硬件)到无形资产(合同和知识产权).hyperledger fabric提供了使用链式事务修改资产的能

HyperLedger Fabric 学习思路分享

HyperLedger Fabric 学习思路分享 HyperLedger Fabric最初是由Digital Asset和IBM公司贡献的.由Linux基金会主办的一个超级账本项目,它是一个目前非常流行并广为人知的区块链网络框架的实现方案.作为一种基于模块化架构开发应用程序或解决方案的基础,HyperLedger Fabric支持如共识和会员服务等即插即用的组件,它的设计初衷是支持不同组件的可插拔实现,并适应整个经济生态系统的复杂性和高精度性.HyperLedger Fabric利用容器技术运

[转帖]Hyperledger Fabric 学习一:简介

Hyperledger Fabric 学习一:简介 https://www.jianshu.com/p/f971858b70f3?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation 1.Hyperledger简介 Hyperledger:超级账本,是首个面向企业应用场景的分布式账本平台,包括了:IBM.Intel.Cisco.DAH.摩根大通.R3等在内的众多科

学习Hyperledger Fabric 实战联盟链

第1章 区块链技术基础本章介绍了区块链技术的相关基础技术要点,纯技术理论角度阐释区块链底层相关概念及所用技术 第2章 Hyperledger Fabric入门本章简单介绍了Hyperledger组织相关的区块链框架及工具,以及Fabric相关的项目介绍,并搭建了第一个Fabric区块链网络,让大家能够快速体验区块链的魅力 第3章 Hyperledger Fabric系统架构本章概括了Fabric的体系架构,包括服务组件,网络拓扑以及Fabric的典型交易流程,让大家对Fabric先有一个整体的概

Hyperledger Fabric 1.0 学习搭建 (三)--- 运行测试e2e-Fabric

3.1.运行fabric-samples的问题说明 该问题说明能够解决6.1.平台特定使用的二进制文件配置第一步的问题.可以选择继续阅读该说明,或者等参考到6.1小节时再反向阅读本说明,具体在6.1中会重新指向本步骤. 一般情况下,我们会参照官网来完成第一个网络测试,在该在线文档中会让我们去下载一个fabric-samples,下载地址在github上,我们需要将其下载至本地是一个fabric-samples-release文件夹,将其更名为fabric-samples随后上传至opt/gopa

HyperLedger Fabric关键技术(6.4)

本节介绍从最底层的账本开始,逐一讲解账本的结构和存储.智能合约的编写和部署.通道的操作.节点的背书和提交.排序的共识和客户端SDK的接口调用,与交易流程顺序相反,由里及表的说明Fabric最关键的技术,通过学习了这六种关键技术知识,能初步掌握Fabric的核心,了解Fabric运作原理. 6.3.1 帐本(Ledger) Fabric帐本(Ledger)是一系列有序和防篡改的状态转换的记录,结构由一个区块链构成,并将不可变的.有序的记录存放在区块中:同时包含一个状态数据库来记录当前的状态,账本的

Hyperledger Fabric架构详解

区块链开源实现HYPERLEDGER FABRIC架构详解 区块链开源实现HYPERLEDGER FABRIC架构详解 2018年5月26日 陶辉 Comments 10 Comments hyperledger fabric是区块链中联盟链的优秀实现,主要代码由IBM.Intel.各大银行等贡献,目前v1.1版的kafka共识方式可达到1000/s次的吞吐量.本文中我们依次讨论:区块链的共通特性.fabric核心概念.fabric的交易执行流程.本文来源于笔者欲对公司部分业务上链而进行培训的P

Hyperledger Fabric 建立一个简单网络

p { margin-bottom: 0.25cm; line-height: 120% } Building you first network 网络结构: 2个Orgnizations(每个Org包含2个peer节点)+1个solo ordering service 打开fabric-sample下的示例first-network p { margin-bottom: 0.25cm; line-height: 120% } 其中byfn.sh为启动这个网络的启动脚本,启动脚本中除建立一个包含