Fabric 的账号体系是 Fabric 的重要的组成部分,由于 Fabric 是基于证书而不是传统的户名名和密码形式,所以会有所不同。
在任何非开放系统中都需要通过账号和密码对系统人口进行相关的管理。联盟链的特点是用户非授权时不能接入区块链,所以Fabric系统中存在一套授权体系,称为Fabric的账号体系。
Fabric 中的账号实际上是根据 PKI 规范生成的一组证书和秘钥文件 。
cryptogen 模块生成的文件中就包含Fabric 账号相关的证书文件,我们通常接触到的账号体系一般是由账号和密码两个属性组成,一旦账号和密码验证成功,后面操作基本和账号,密码没有关系了。但是区块链系统的一个非常重要的特点是:记录在区块链中的数据具有不可逆,不可篡改的特性。Fabric 中每条交易都会加上发起者的标签(签名证书),同时用发起人的私钥进行加密。如果交易需要其他组织的节点提供背书功能,那么背书节点也会在交易中加入自己的签名。这样每一笔交易的操作过程会非常清晰并且不可篡改。 鉴于传统系统中基于账号和密码的验证体系已经无法完成这样的工作,因此 Fabric 设计了基于 PKI 规范的账号系统满足这样的要求。
msp
- admincerts
- cacerts
- keystore
- signcerts
- tlscacertstls
- ca.crt
- server.crt
- server.key
这些文件分别存放在msp文件夹和tls文件夹中。
msp中主要存放签名用的证书文件和加密用的私钥文件。一共五部分。
df
tls 文件夹中存放加密通信相关的证书文件。
注:账号的说法是本书对 Fabric 中账号的特定称谓 Fab ic 的官方文档把这些证书称为 Membership Service Providers ,简称为MSP ,我们无法找到更加准确的翻译,所以本书暂且用账号这个比较传统的名词来指代 Fa ric 生成的这些证书,从实际的运行效果看,这些证书文件等同于账号的作用。
本文中账号就是 MSP
cryptogen模块是创建Fabric账号的方式之一。前面了解到cryptogen可以通过配置文件生成Fabric运行所需要的相关账号文件,在配置文件中可以指定每个组织包含的用户数和节点数。然后cryptogen模块会根据配置文件的定义生成相关数据的配置文件。如果系统发生变化,需要引入新的组织,或者组织中需要增加新的账号和用户,这他妈该怎么办?是不是很懵逼,我也没办法…
cryptogen模块通过一个配合可以部分解决这个问题。
- Orderer rOrgs:
- Name: Orderer
- Domain:example.com
- Specs:
- Hosename:orderer
- PeerOrgs:
- Name:Org1
- Domain:org1.example.com
- Template:
- Count:1
- Users:
- Count:1
- Name:Org2
- Domain:org2.example.com
- Template:
- Count:1
- Users:
- Count:1
在配置文件中PerrOrgs节点Template子节点中有个属Count,Count表示当前组织包含Peer节点的数目,同时也会成生成相应数目的配置文件。例子中给出的组织Org1设置的Peer节点数为4,cryptogen模块根据配置文件会给组织Org1生成4个Peer节点所有需要的账号。
- ca
- aldb72lc0cfb6fl07fc4550ld29866633d2la3492c87bb352687b2e8e85b652e sk
- ca.orgl . qklszzn . com-cert . pem
- msp
- admincerts
- cacerts
- tlscacerts
- peers
- peer0. org1 . qklszzn com
- peer1. org1 . qklszzn com
- peer2. org1 . qklszzn com
- peer3. org1 . qklszzn com
- tlsca
- f92d78e8195795 e 3all5c4cl29d78edaac70ec4f5ef4764df43elde245e7d467_ sk
- tlsca orgl qklszzn . com cert . pem
- users
观察上面内容,共生成4个Peer节点账号文件,这些文件夹的命名是由规则的,peer+索引为前缀+域名。所以前缀的值为0 到 Count-1.这里有一个start属性,这就是我们要找的这孙子,费了好大劲。start属性就是继续添加Peer节点使用的,Start用来表示生成Peer节点账号文件的文件夹命名的前缀,默认是0.如果需要增加新的节点,可以给Start属性赋值上一次的count。
这里以上面例子为例。如果需要给组织Org1新增3个Peer节点,可以使用下面配置:
- PeerOrgs:
- Name:Org1
- Domain:org1.qklszzn.com
- Template:
- Count:3
- Start:4
通过上面的配置文件, cryptogen 模块可以给组织Org1新增三个Peer节点的配置文件,我们重新回到组织Org1的账号文件目录中,再次执行 tree-L2,显示如下:
- ca
- aldb72lc0cfb6fl07fc4550ld29866633d2la3492c87bb352687b2e8e85b652e sk
- ca.orgl . qklszzn . com-cert . pem
- msp
- admincerts
- cacerts
- tlscacerts
- peers
- peer0. org1 . qklszzn com
- peer1. org1 . qklszzn com
- peer2. org1 . qklszzn com
- peer3. org1 . qklszzn com
- peer4. org1 . qklszzn com
- peer5. org1 . qklszzn com
- peer6. org1 . qklszzn com
- tlsca
- f92d78e8195795 e 3all5c4cl29d78edaac70ec4f5ef4764df43elde245e7d467_ sk
- tlsca orgl qklszzn . com cert . pem
- users
成功添加了三个Peer节点的配置文件。
那么问题来了,如果动态添加用户账号该怎么办?目前最新的Fabric版本中并没有提供相关的功能。
有没有简单点的解决Fabric账号问题,就是 Fabric-ca 账号服务器。
Fabric-ca项目有 Fabric-ca-server 和Fabric-ca-client 两个模块组成。
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/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-client 或者实现其通信协议的客户端发起请求。fabric-ca-server 有三种方式设置配置信息。
- init:初始化fabric-ca 服务器
- start:启动fabric-ca服务器
- version:显示版本
- –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的命令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-config.yaml.
fabric-ca-server的配置文件一共11部分。
通用配置部分包含了系统 些公用属性。
- port:7054 //监听端口号
- debug:false //是否调试
- crlsizelimit:512000
- cacount: //支持的CA数目
- cafiles: //相关CA配置文件
- crl: //
- expiry:24h //授权证书的有效期
tls 部分主要包含了 TLS 通信相关的配置,包括是否需要打开 TLS 通信,TLS 通信的证书和私钥等文件的路径等。
- tls:
- enabled:false //是否启用TLS
- certfile: tls-cert.pem //TLS证书文件
- keyfile: //TLS私钥文件
- clientauth: //
- type:noclientcert //客户端类型
- certfiles: //客户端证书类型
ca 服务器属性的配置,包含发布证书的组织机构的名称和相关的证书文件路径 。
- ca:
- name: //CA 的名字,如果存在多个 CA 服务器,不能重复
- keyfile: ca-key.pen ///私钥文件
- certfile:ca-cert.pem ///证书文件
- chainfile:ca-chain.pen ///证书链文件
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 部分包含了 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
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
ffiliations 节点包含了组织中的部门的相关配置信息,这些配置信息在客户端 SDK用时相关的参数必须保持一致。
- affiliations :
- org1:
- department1
- department2
- org2:
- department1
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
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
当前 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 start -H /opt/hyperledger/fabric-ca --boot admin:adminpw
启动完成后可以通过客户端程序或者通过fabric-ca-client模块访问 fabric-ca-server 服务器。
fabric-ca-server 提供了一组RESTAPI接口供第三方应用程序调用。fabric-ca-client对这些接口进行了封装,只需要设计简单的参数便可完成账号注册,账号授权等操作。fabric-ca-client模块由一组子命令和相关的参数选项组成。
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:注销证书的序列号
- –csr.cn:CA签名请求时,请求报文中的通用名
- –csr.hosts::CA签名请求时,请求报文中的主机名
- –csr.serialnumber::CA签名请求时,请求报文中的序列号
- –csr.names::CA签名请求时,请求报文中的附件名称
- -m,–myhost::CA签名请求时,请求报文中请求主机名称,默认值是本地主机
- –tls.certfiles:TLS通信模式下的证书文件,PEM文件格式
- –tls.client.certfile: TLS通信模式下客户端的证书文件,PEM文件格式
- –tls.client.keyfile:TLS通信模式下客户端的私钥文件
Fabric-ca是Fabric的cryptogen模块有力补充,在项目中占有非常重要的作用。
- ca
- aldb72lc0cfb6fl07fc4550ld29866633d2la3492c87bb352687b2e8e85b652e sk
- ca.orgl . qklszzn . com-cert . pem
- msp
- admincerts
- cacerts
- tlscacerts
- peers
- peer0. org1 . qklszzn com
- peer1. org1 . qklszzn com
- peer2. org1 . qklszzn com
- peer3. org1 . qklszzn com
- peer4. org1 . qklszzn com
- peer5. org1 . qklszzn com
- peer6. org1 . qklszzn com
- tlsca
- f92d78e8195795 e 3all5c4cl29d78edaac70ec4f5ef4764df43elde245e7d467_ sk
- tlsca orgl qklszzn . com cert . pem
- users
在ca文件夹中存放了将fabric-ca-server绑定到组织org1的相关文件。
现在可以绑定这些文件,绑定。
上述步骤 fabric-ca-server 就被绑定到组织 orgl 中了。
mkdir -p /opt/hyperledger/fabric-client
目录常见完成之后,利用管理员账号和密码注册,获取管理员账号msp的证书文件。
export FABRIC_CA_CLIENT_HOME =/opt/hyperledger/fabric-client fabric-ca-client enroll -uhttp://admin:adminpw@localhost:7054 - M /opt/hyperledger/fabric_client
fabric-ca-client register --id.name usertest --id.type user --id.affiliation org1.deparment1 --id.secret user2wd -u http://localhost:7054
mkdir -p /opt/hyperledger/qklszznuser
在上面创建的目录中,登录账号usertest,并且登录成功的账号的相关文件会保存到制定目录中。 登记账号的命令如下:
fabric-ca-client enroll -u http://usertest:user2wd@localhost:7054 -M /opt/hyperledger/qklszznuser/msp
mkdir /opt/hyperledger/qklszznuser/msp/admincerts
cp/opt/hyperledger_commconfig/fabricconfig/cryptoconfig/perrorganizations/org1.qklszzn.com/users/[email protected]/msp/signcerts/* /opt hyperledger/qklszznuser/msp/admincerts
复制公用TLS签名证书的命令如下:
mkdir /opt/hyperledger/qklszznuser/tls
cp /opt/hyperledger_commconfig/fabricconfig/cryptoconfig/peerOrganizations/org1.qklszzn.com/peers/peer0.org1.qklszzn.com/tls/* /opt/hyperledger/qklszznuser/tls
- msp
- admincerts
- cacerts
- 192-168-23-212-7054.pem
- keystore
- 5f470b06e7b34517elf5bc6bl05e2c9ec4a47759378997e826de6f305c075b47_sk
- signcerts
- cert . pem
- tlscacerts
- tls-192-168-23-212-7054.pem
- tls
- ca . crt
- server . crt
- server . key
介绍了Fabric是 如何通过账号来进行权限控制的。灵活运用账号功能是开发基础Fabric技术框架项目的先决条件。