06. Fabric的账号体系

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中主要存放签名用的证书文件和加密用的私钥文件。一共五部分。
df

  • admincerts:管理员证书
  • cacerts:根CA服务器的证书
  • keystore:节点或者账号的私钥
  • singcerts:符合x.509的节点或者用户证书文件
  • tlscacerts:TLS根CA的证书
tls文件夹中的内容

tls 文件夹中存放加密通信相关的证书文件。

注:账号的说法是本书对 Fabric 中账号的特定称谓 Fab ic 的官方文档把这些证书称为 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模块通过一个配合可以部分解决这个问题。

  1. 通过 cryptogen 模块 子命令 owtemplate 显示默认的模板。
  • 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节点所有需要的账号。

  1. 进入组织Org1的账号文件夹中, 执行tree -L2 命令内容显示如下:

观察上面内容,共生成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,显示如下:

成功添加了三个Peer节点的配置文件。

那么问题来了,如果动态添加用户账号该怎么办?目前最新的Fabric版本中并没有提供相关的功能。
有没有简单点的解决Fabric账号问题,就是 Fabric-ca 账号服务器

1.3 Fabric账号服务器: Fabric-ca

Fabric-ca项目有 Fabric-ca-server 和Fabric-ca-client 两个模块组成。

06. Fabric的账号体系_第1张图片

Fabric-ca的编译和安装

Fabric-ca是Golang开发的应用程序。下面将演示在Fabric-ca Ubuntu 中安装。

  1. 安装系统组件包

sudo apt install btool 1 ibltdl dev

  1. 下载源代码并编译

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

  1. 安装编译好的可执行文件。

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

  1. 检查

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部分。

  1. 通用配置

通用配置部分包含了系统 些公用属性。

  • port:7054 //监听端口号
  • debug:false //是否调试
  • crlsizelimit:512000
  • cacount: //支持的CA数目
  • cafiles: //相关CA配置文件
  • crl: //
    • expiry:24h //授权证书的有效期
  1. tls

tls 部分主要包含了 TLS 通信相关的配置,包括是否需要打开 TLS 通信,TLS 通信的证书和私钥等文件的路径等。

  • tls:
    • enabled:false //是否启用TLS
    • certfile: tls-cert.pem //TLS证书文件
    • keyfile: //TLS私钥文件
    • clientauth: //
      • type:noclientcert //客户端类型
      • certfiles: //客户端证书类型
  1. ca

ca 服务器属性的配置,包含发布证书的组织机构的名称和相关的证书文件路径 。

  • ca:
    • name: //CA 的名字,如果存在多个 CA 服务器,不能重复
    • keyfile: ca-key.pen ///私钥文件
    • certfile:ca-cert.pem ///证书文件
    • chainfile:ca-chain.pen ///证书链文件
  1. 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:"*"
  1. 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
  1. 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
  1. affiliations

ffiliations 节点包含了组织中的部门的相关配置信息,这些配置信息在客户端 SDK用时相关的参数必须保持一致。

  • affiliations :
    • org1:
      • department1
      • department2
    • org2:
      • department1
  1. 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
  1. 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
  1. 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模块的参数选项
  1. 基本管理
  • –caname:CA服务器名称
  • -H,–home:客户端的目录,用来存放客户端相关的文件
  • -M,–mspdir:客户端的账号证书文件的目录
  • -d,–debug:将客户端的日志设计为debug模式
  • -u,–url:fabric-ca-server的地址
  1. 账号登记
  • -enrollment.attrs:账号登记请求中的属性
  • –enrollment.label:登记请求中的HSM相关的标签
  • –enrollment.profile:登记请求中的profile
  1. 账号注册
  • –id.affiliation:账号注册时组织的部门信息
  • –id.attrs:账号注册时的属性列表
  • –id.maxenrollments:当前注册后可以进行登记的次数
  • –id.name:账号注册时的用户名
  • –id.secret:账号注册的密码
  • –id.type 账号注册的类型 默认为user
  1. 证书吊销
  • -a,–revoke.aki:注销证书时需要的公钥
  • -e,–revoke.name:注销证书时的实体名称
  • -r,–revoke.reasion:注销的原因
  • -s,–revoke.serial:注销证书的序列号
  1. CA证签名
  • –csr.cn:CA签名请求时,请求报文中的通用名
  • –csr.hosts::CA签名请求时,请求报文中的主机名
  • –csr.serialnumber::CA签名请求时,请求报文中的序列号
  • –csr.names::CA签名请求时,请求报文中的附件名称
  • -m,–myhost::CA签名请求时,请求报文中请求主机名称,默认值是本地主机
  1. TLS通信
  • –tls.certfiles:TLS通信模式下的证书文件,PEM文件格式
  • –tls.client.certfile: TLS通信模式下客户端的证书文件,PEM文件格式
  • –tls.client.keyfile:TLS通信模式下客户端的私钥文件

1.4 将fabric-ca-server绑定到现有的项目中

Fabric-ca是Fabric的cryptogen模块有力补充,在项目中占有非常重要的作用。

绑定 fabric-ca-server 到现有组织

  1. 打开 fabric-ca-server的配置文件 fabric-ca-server-config.yaml.在配置文件找到以下内容:
  • ca:
    • name:ca-org1
    • keyfile:
    • certfile:
    • chainfile:ca-chain.pem
  1. 进入证书文件夹,,进入存放组织Org相关的证书的文件夹。执行命令tree -L2:

在ca文件夹中存放了将fabric-ca-server绑定到组织org1的相关文件。
现在可以绑定这些文件,绑定。

  • keyfile:对应ca文件夹中文件名后缀为-sk的文件
  • certfile:对应ca文件夹中文件名为ca.org1.qklszzn.com-cert.pem的文件
    06. Fabric的账号体系_第2张图片

上述步骤 fabric-ca-server 就被绑定到组织 orgl 中了。

通过客户端从已经绑定的fabric-ca-server中生成账号

  1. 设置 fabric-ca-client环境变量
    创建目录:

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

  1. 注册账号
    名为usertest,密码为user2wd 注册命令如下:

fabric-ca-client register --id.name usertest --id.type user --id.affiliation org1.deparment1 --id.secret user2wd -u http://localhost:7054

  1. 载入账号
    将上一步注册的账号usertest加载到本地,首先需要再本地创建给目录用来存放从服务器下载的证书,目录可以是任何目录。

mkdir -p /opt/hyperledger/qklszznuser

在上面创建的目录中,登录账号usertest,并且登录成功的账号的相关文件会保存到制定目录中。 登记账号的命令如下:

fabric-ca-client enroll -u http://usertest:user2wd@localhost:7054 -M /opt/hyperledger/qklszznuser/msp

  1. 复制管理员签名和公用TLS证书文件
    复制管理账号的签名的命令:

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

  1. 查看账号
    进入文件夹通过tree命令查看证书文件的命令。如下所示:
  • 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
  1. fabric-ca-server 客户端访问接口
    在Fabric项目中更多的应用场景通过fabric-ca-server提供的RESTAPI接口完成账号注册,账号登记等操作。

1.5 总结

介绍了Fabric是 如何通过账号来进行权限控制的。灵活运用账号功能是开发基础Fabric技术框架项目的先决条件。

你可能感兴趣的:(hyperledger笔记)