1.1 Fabric账号简介
Fabric 的账号体系是 Fabric 的重要的组成部分,由于 Fabric 是基于证书而不是传统的户名名和密码形式,所以会有所不同。
- 在任何非开放系统中都需要通过账号和密码对系统人口进行相关的管理。联盟链的特点是用户非授权时不能接入区块链,所以Fabric系统中存在一套授权体系,称为Fabric的账号体系。
Fabric账号是什么
Fabric 中的账号实际上是根据 PKI 规范生成的一组证书和秘钥文件 。
- cryptogen 模块生成的文件中就包含Fabric 账号相关的证书文件,我们通常接触到的账号体系一般是由账号和密码两个属性组成,一旦账号和密码验证成功,后面操作基本和账号,密码没有关系了。但是区块链系统的一个非常重要的特点是:记录在区块链中的数据具有不可逆,不可篡改的特性。Fabric 中每条交易都会加上发起者的标签(签名证书),同时用发起人的私钥进行加密。如果交易需要其他组织的节点提供背书功能,那么背书节点也会在交易中加入自己的签名。这样每一笔交易的操作过程会非常清晰并且不可篡改。 鉴于传统系统中基于账号和密码的验证体系已经无法完成这样的工作,因此 Fabric 设计了基于 PKI 规范的账号系统满足这样的要求。
一个完整的Fabric账号的结构
- msp
- admincerts
- cacerts
- keystore
- signcerts
- tlscacerts- tls
- ca.crt
- server.crt
- server.key
这些文件分别存放在msp文件夹和tls文件夹中。
msp文件夹内容
msp中主要存放签名用的证书文件和加密用的私钥文件。一共五部分。
- 释义
- admincerts:管理员证书
- cacerts:根CA服务器的证书
- keystore:节点或者账号的私钥
- singcerts:符合x.509的节点或者用户证书文件
- tlscacerts:TLS根CA的证书
- tls文件夹中的内容
- tls 文件夹中存放加密通信相关的证书文件
注:账号的说法是本书对 Fabric 中账号的特定称谓Fabric的官方文档把这些证书称为 Membership Service Providers ,简称为MSP ,我们无法找到更加准确的翻译,所以本书暂且用账号这个比较传统的名词来指代 Fa ric 生成的这些证书,从实际的运行效果看,这些证书文件等同于账号的作用。
本文中账号就是 MSP
Fabric账号哪些地方需要用到
启动Orderer的账号
启动Peer的账号
创建Channe的账号
Peer和Orderer是有属于自己的账号,创建Channel使用的是用户账号。其中Peer和常见Channel的用户账号属于有个组织,而Orderer的启动账号只属于他自己。
1.2 基于cryptogen的账户管理体系
- cryptogen模块是创建Fabric账号的方式之一。前面了解到cryptogen可以通过配置文件生成Fabric运行所需要的相关账号文件,在配置文件中可以指定每个组织包含的用户数和节点数。然后cryptogen模块会根据配置文件的定义生成相关数据的配置文件。如果系统发生变化,需要引入新的组织,或者组织中需要增加新的账号和用户,这他妈该怎么办?是不是很懵逼,我也没办法…
cryptogen模块通过一个配合可以部分解决这个问题。
- 通过 cryptogen 模块 子命令 owtemplate 显示默认的模板。
- 进入组织Org1的账号文件夹中, 执行tree -L2 命令
- 通过上面的配置文件, cryptogen 模块可以给组织Org1新增三个Peer节点的配置文件,我们重新回到组织Org1的账号文件目录中,再次执行 tree-L2.
- 那么问题来了,如果动态添加用户账号该怎么办?目前最新的Fabric版本中并没有提供相关的功能。有没有简单点的解决Fabric账号问题,就是 Fabric-ca 账号服务器。
1.3 Fabric账号服务器: Fabric-ca
- Fabric-ca项目有 Fabric-ca-server 和Fabric-ca-client 两个模块组成。
Fabric-ca的编译和安装
Fabric-ca是Golang开发的应用程序。下面将演示在Fabric-ca Ubuntu 中安装。
- 安装系统组件包
sudo apt install btool 1 ibltdl dev
- 下载源代码并编译
cd $GOPATH/src/github.com/hyperledger git clone http://gerrit.hyperledger.org/r/fabric-ca cd $GPPATH/src/github.com/hyperledger/fabric-ca make fabric-ca-server
make fabric-ca-client
- 安装编译好的可执行文件。
cd $GOPATH/src/github.com/hyperledger git clone http://gerrit.hyperledger.org/r/fabric-ca cd $GPPATH/src/github.com/hyperledger/fabric-ca make fabric-ca-server
make fabric-ca-clientcd $GOPATH/src/github.com/hyperledger/fabric-ca/bin cp $GOPATH/src/github.com/hyperledger/fabric-ca/bin/* /user/local/bin
chmod -R 775 /user/local/bin/fabric-ca-server chmod -R 775 /user/local/bin/fabric-ca-client
- 检查
fabric-ca-server version fabric-ca-client version
fabric-ca-server 的启动和配置
fabric-ca-server 启动之后欧是以守护进程方式存在,可以通过fabric-ca-client 或者实现其通信协议的客户端发起请求。fabric-ca-server 有三种方式设置配置信息。
- 启动参数
- 环境变量
- 配置文件
fabric-ca-server 的命令行选项
- init:初始化fabric-ca 服务器
- start:启动fabric-ca服务器
- version:显示版本
fabric-ca-serve的选项
address:Fabric 服务器的监听地址(默认为“0.0.0. 。”)
- b,–boot:系统启动对应的管理员账号和密码
– ca.certfile:CA证书文件(默认为“ca-cert.pen”)
–ca.chainfile:CA链证书文件(默认为“ ca-chain.pem”)
–ca.keyfile:CA秘钥文件(默认为“ca-key.pem”)
-n,–ca.name:证书颁发机构名称
–cacount:CA实例的数量
–cafiles:以逗号分隔的CA配置文件的列表
–crl.expiry:CRL请求到期时间(默认为24h)
–crlsizelimit:可接受的CRL的大小限制,以字节为单位(默认为521000)
–csr.cn:请求父Fabric-ca服务器的证书签名时使用的公用名称
–csr.hosts:逗号分隔的父类Fabric-ca服务器的主机名,支持多个
–csr.serialnumber:请求父类Fabric-ca服务器的序列号
–db.datasource:数据库的名称(默认为“fabric-ca-server.db”),仅仅针对–db.type选项为sqlite3有效
–db.tls.certfiles:和数据库TLS通信时用的证书文件,PEM格式
–db.tls.client.certfile:和数据库TLS通信时用的证书文件,PEM格式
–db.tls.client.keyfile:和数据库进行TLS通信时客户端的私钥文件,PEM格式
–db.type:存储账号类型的数据库的类型,目前支持三种数据库类型,sqlite3,postgres,mysql
–d,–debug:启动调试级别日志记录。
-H,–home:Fabric-ca服务器的主目录(默认为当前目录)
-intermediate.enrollment.label: 操作中使用的标签
-intermediat e.enrollment.profile:发型证书时要使用的签名配置文件的名称
–intermediate. parentserver. caname: 服务器CA名称
-u,–intermediate.parentserver. url:父Fabric-ca服务器的URL
–ldap.enabled: 启动LDAP服务进行客户端身份验证和相关属性的管理
–ldap.groupfilter:LDAP 进行组过滤模式,默认值为( memberUid=%s )
–ldap tls.certfiles:LDAP 服务器的证书文件, PEM 格式(例如root1.pem,root2.pem)
–ldap.tls.client.certfile:LDAP 服务客户端的证书文件,PEM格式。
–ldap.tls.client.keyfile:LDAP 服务客户端私钥文件,PEM格式。
–ldap.url:LDAP服务的URL
–ldap.userfilter:LDAP服务器的用户过滤器,默认为(uid=%s)
-p,–port :Fabric-ca 服务器监听端口(默认为7054)
– registry.maxenrollments:最大允许注册的用户数:如果LDAP未启动时有效(默认为-1)
–tls.certfile:Fabric-ca 服务器的证书,PEM格式(默认‘tls-cert.pem’)
–tls.clientauth.certfiles:Fabric-ca服务器的客户端证书
–tls.clientauth.type:客户端类型(noclientcert)
–tls.enabled:在监听端口上启动TLS
fabric-ca-server的初始化
- fabric-ca-server 还可以通过配置文件进行参数设置。
执行fabric-ca-server的命令init,可以初始化成相关的配置文件。(执行之前先创建相关的文件夹)
mkdir -p /opt/hyperledger/fabric-ca-server
fabric-ca-server 服务器初始化的命令如下:
fabric-ca-server init -b admin:adminpw
-b 参数后面的是 fabric-ca-server 服务器管理账号的用 户名和 密码,这里给出的是个例子,而且很多资料都给出了这个例子,但是如果在生产系统中建议务必使用比较复杂的密码,而避免使用本例中的用户名和密码,避免恶意猜测用户名密码的行为。
- 初始化命令执行完后会在当前的目录下面生成相应的配置文件。
fabric-ca-server-config.yaml :配置文件
fabric-ca-server.db :数据库文件(数据库选择sqlite3时有效)
ca-cert.pem:证书文件
msp:私钥文件夹
fabric-ca-server 的配置文件
fabric-ca-server 配置文件的内容可以参考上 步生成的文件 fabric-ca -server-config.yaml.
fabric-ca-server的配置文件一共11部分。
- 通用配置
通用配置部分包含了系统 些公用属性。
port:7054 //监听端口号
debug:false //是否调试
crlsizelimit:512000
cacount: //支持的CA数目
cafiles: //相关CA配置文件
crl: //
expiry:24h //授权证书的有效期
- tls
tls 部分主要包含了 TLS 通信相关的配置,包括是否需要打开 TLS 通信,TLS 通信的证书和私钥等文件的路径等。
tls:
enabled:false //是否启用TLS
certfile: tls-cert.pem //TLS证书文件
keyfile: //TLS私钥文件
clientauth: //
type:noclientcert //客户端类型
certfiles: //客户端证书类型
- ca
ca 服务器属性的配置,包含发布证书的组织机构的名称和相关的证书文件路径 。
ca:
name: //CA 的名字,如果存在多个 CA 服务器,不能重复
keyfile: ca-key.pen ///私钥文件
certfile:ca-cert.pem ///证书文件
chainfile:ca-chain.pen ///证书链文件
- registry
registry节点包含了客户端注册相关的信息。
registry:
maxenrollments:-1
identities: //注册实体信息,可以有多个
name:adminpw
type:client
affiliation:""
maxenrollments:-1
attrs:
hf.Registrar.Roles:“client,user,peer,validator,auditor”
hf.Registrar.DelegateRoles:“client,user,validator,auditor”
hf.Revoker:true
hf.IntermediateCA:true
hf.GenCRL:true
hf.Registrar.Attributes:"*"
- db
db 部分包含了 Fabric-ca服务器存储账号文件的数据类型的配置。
db:
type:sqlite3
datasource:fabric-ca-server.db
tls:
enabled:false
certfiles:
db-server-cert.pem
client:
certfile:db-client-cert.pem
keyfile:db-client-key.pem
- ldap
Fabric-ca 可以配置使用远端 DAP 务器来进行注册管理并且保存注册相关的数据, LDAP服务相关的配置信息包含在 ldap 节点中。
ldap:
ldap:
enabled:true
url: ldap://cn://cn=admin,dc=example,dc=org:admin@localhost:10389
/dc=example,dc=org
userfilter:(uid=%s)
tls:
certfiles:
ldap-server-cert.pem
client:
certfile:ldap-client-cert.pem
keyfile:ldap-client-key.pem
- affiliations
ffiliations 节点包含了组织中的部门的相关配置信息,这些配置信息在客户端 SDK用时相关的参数必须保持一致。
affiliations :
org1:
department1
department2
org2:
department1
- signing 节点
signing 节点包含了证书签发相关的配置,包括证书的到期时间等属性。
signing:
default: //默认的签发ecert
usage: //证书签发的作用域
digital signature
expiry:8760h //证书有效时间
profiles:
ca:
usage:
cert sign
expiry:43800h
caconstraint:
isca:true
maxpathlen:0 //现在中间层继续下发节点
tls:
usage:
signing
key encipherment
server auth
client auth
key agreement
expiry:8760h
- csrd
csr 节点包含了证书申请请求时需要使用的配置信息。
csr:
cn:fabric-ca-server //服务器名称
names: //证书签发单位的基本信息
C:US
ST:“North Carolina”
L:
O:Hyperledger
OU:Fabric
hosts:
robertfeng-All-Series
localhost
ca:
expiry:131400h //证书有效时间
pathlength:1 //下一级服务器是否可以继续其下级服务签发证书, -1为不可。取值大于0时为允许层数
10 . bccsp
bsssp节点包含了加密算法相关的配置,在bccsp节点中可以选择相关的加密算法以及相关加密算法的证书文件。
bccsp:
default:SW //加密方式,硬件加密和程序加密
sw:
hash: SHA2
security:256
filekeystore:
keystore:msp/keystore
- intermediate
当前 CA 作为中间 时相关的配置。
intermediate:
parentserver: //上级CA服务器相关信息
url:
caname:
enrollment: //需要在上级CA服务器进行登记的信息
hosts: //上级CA服务器地址列表,用逗号分隔
profile: //签发用的profile
label: //用于HSM操作的标签信息
tls: //TLS通信相关的属性信息
certfiles: //根证书文件
client: //如果启动客户端文件需要的使用到的部分
certfile: //客户端证书文件
keyfile: //客户端私钥文件
fabric-ca-server的启动
配置文件设置好之后就可以启动 fabric-ca-server服务器了。启动命令如下:
fabric-ca-server start -H /opt/hyperledger/fabric-ca --boot admin:adminpw
启动完成后可以通过客户端程序或者通过fabric-ca-client模块访问 fabric-ca-server 服务器。
fabric-ca-client的使用
- fabric-ca-server 提供了一组RESTAPI接口供第三方应用程序调用。fabric-ca-client对这些接口进行了封装,只需要设计简单的参数便可完成账号注册,账号授权等操作。fabric-ca-client模块由一组子命令和相关的参数选项组成。
fabric-ca-client模块的子命令
fabric-ca-client模块通过相关自命令完成账号注册,授权申请,证书撤销等操作
enroll:登记账号
gencrl:撤销证书
gencsr:创建证书签名
getcacert:获取CA链证书
reenroll:重新登记账号
register:注册一个新账号
revoke:撤销一个账号
version:显示版本信息
fabric-ca-client模块的参数选项
- 基本管理
–caname:CA服务器名称
-H,–home:客户端的目录,用来存放客户端相关的文件
-M,–mspdir:客户端的账号证书文件的目录
-d,–debug:将客户端的日志设计为debug模式
-u,–url:fabric-ca-server的地址
- 账号登记
-enrollment.attrs:账号登记请求中的属性
–enrollment.label:登记请求中的HSM相关的标签
–enrollment.profile:登记请求中的profile
- 账号注册
–id.affiliation:账号注册时组织的部门信息
–id.attrs:账号注册时的属性列表
–id.maxenrollments:当前注册后可以进行登记的次数
–id.name:账号注册时的用户名
–id.secret:账号注册的密码
–id.type 账号注册的类型 默认为user
- 证书吊销
-a,–revoke.aki:注销证书时需要的公钥
-e,–revoke.name:注销证书时的实体名称
-r,–revoke.reasion:注销的原因
-s,–revoke.serial:注销证书的序列号
5.CA证签名
–csr.cn:CA签名请求时,请求报文中的通用名
–csr.hosts::CA签名请求时,请求报文中的主机名
–csr.serialnumber::CA签名请求时,请求报文中的序列号
–csr.names::CA签名请求时,请求报文中的附件名称
-m,–myhost::CA签名请求时,请求报文中请求主机名称,默认值是本地主机
- TLS通信
–tls.certfiles:TLS通信模式下的证书文件,PEM文件格式
–tls.client.certfile: TLS通信模式下客户端的证书文件,PEM文件格式
–tls.client.keyfile:TLS通信模式下客户端的私钥文件
1.5 总结
介绍了Fabric是 如何通过账号来进行权限控制的。灵活运用账号功能是开发基础Fabric技术框架项目的先决条件。