Hyperledger fabric 账号 CA篇 (七)
1、Fabric账号
1.1、含义
根据PKI规范生成的一组证书和密钥文件
1.2、作用
- 保证记录在区块链的数据具有不可逆,防篡改
- Fabric中每条组织交易都会加上发起者的标签(签名证书),同时用发起人的私钥进行加密
- 如果交易需要其他组织的节点提供背书功能,那么背书节点也会在交易中加入自己的签名
1.3、适用场景
- 启动order节点
- 启动peer节点
- 创建通道
2、证书文件
2.1、组织证书
liuhui@liuhui-ThinkPad-T550:~/fabricsample/crypto-config/peerOrganizations/org1.example.com$ tree msp
msp
├── admincerts
├── cacerts
│ └── ca.org1.example.com-cert.pem
├── config.yaml
└── tlscacerts
└── tlsca.org1.example.com-cert.pem
3 directories, 3 files
2.2、节点证书
liuhui@liuhui-ThinkPad-T550:~/fabricsample/crypto-config/peerOrganizations/org1.example.com/peers$ tree peer0.org1.example.com/
peer0.org1.example.com/
├── msp
│ ├── admincerts
│ ├── cacerts
│ │ └── ca.org1.example.com-cert.pem
│ ├── config.yaml
│ ├── keystore
│ │ └── cf8d9658215ef005bc979d4ef3402dfafdbee7762b131eaaa33031c97d03ae66_sk
│ ├── signcerts
│ │ └── peer0.org1.example.com-cert.pem
│ └── tlscacerts
│ └── tlsca.org1.example.com-cert.pem
└── tls
├── ca.crt
├── server.crt
└── server.key
7 directories, 8 files
msp文件夹中内容主要用于存放签名用的证书文件和加密用的私钥文件
- admincerts:管理员证书
- cacerts:根CA服务器的证书
- keystore:节点或者账号的私钥
- signcerts:符合X.509的节点或者用户证书文件
- tlscacerts:TLS根CA的证书
tls文件夹:存放加密通信相关的证书文件
2.3、用户证书
liuhui@liuhui-ThinkPad-T550:~/fabricsample/crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com$ tree msp
msp
├── admincerts
├── cacerts
│ └── ca.org1.example.com-cert.pem
├── config.yaml
├── keystore
│ └── d6f96d6351b1504e31b7612919fb70f2c5a889f8cda4627c4bb5f3c542f3026d_sk
├── signcerts
│ └── User1@org1.example.com-cert.pem
└── tlscacerts
└── tlsca.org1.example.com-cert.pem
5 directories, 5 files
3、Fabric-CA
3.1、含义及架构解析
fabric-ca项目是专门为了解决fabric账号问题而发起的一个开源项目,它解决了fabric账号生成的问题,fabric-ca项目由fabric-server和fabric-client两个模块组成,其中fabric-server在fabric中占有非常重要的作用,我们使用cryptogen命令可以同配置文件生成一些账号信息,但是如果有动态添加账号的需求,就无法满足,所以引入了fabric-ca
![](/home/liuhui/文档/hyperledge Fabric/fabric-ca.png)
fabric-CA提供了两种访问方式调用server服务
- 通过fabric-client调用
- 通过SDK调用(node.js,java,go)
通常情况下,一个组织会对应一个fabric-server服务器,根CA可以对子CA进行授权,便可以在子CA中注册账号
当fabric中多个组织时,要在每个组织中部署一个fabric-ca服务器,给当前组织注册新用户
3.2、安装Fabric CA
-
安装libtool 与libltdl-dev依赖包
$ sudo apt update $ sudo apt install libtool libltdl-dev
-
安装服务端与客户端(两种方式,我是第二种方式安装成功的,第一种下载失败)
(1)直接下载二进制可执行文件
$ go get -u github.com/hyperledger/fabric-ca/cmd/...
命令下载后会在
$GOPATH/bin
目录下产生两个可执行文件- fabric-ca-client
- fabric-ca-server
设置环境变量,便于在任何路径下可以直接使用这两个命令
export PATH=$PATH:$GOPATH/bin
(2)从源码编译安装
从
github.com
下载fabric-ca
源码到hyperledger
目录下cd $GOPATH/src/github.com/hyperledger/ git clone https://github.com/hyperledger/fabric-ca.git cd fabric-ca #进行源码编译 make fabric-ca-server make fabric-ca-client
当前文件下会编译出一个
bin
文件夹,最后一步将该文件夹添加到环境变量,保证文件夹下命令可以在任何路径下执行。
3.3、启动Fabric-CA
在docker-compose配置文件中添加CA服务,然后运行Shell命令启动
在docker-compose启动时使用的配置文件docker-compose.yaml中添加如下配置项
注意:有几个组织加几个CA
#配置项中的证书文件和私钥文件都需要去相应的组织中寻找进行修改
services:
################################添加的内容#####################################
ca.example.com: # fabric-ca的服务器名,可修改
image: hyperledger/fabric-ca #镜像文件
environment:
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server #fabric-ca容器中的home目录
- FABRIC_CA_SERVER_CA_NAME=ca.example.com #fabric-ca服务器的名字,与前面一致
#fabric-ca服务器证书文件,确定当前fabric-ca属于哪个组织
- FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
#fabric-ca服务器的私钥文件
- FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/4239aa0dcd76daeeb8ba0cda701851d14504d31aad1b2ddddbac6a57365e497c_sk
ports: #绑定的端口
- "7054:7054"
#启动fabric-ca-server服务命令
#参数:admin:adminpw(可修改)
#---admin:fabric-ca-server的登陆用户名
#---adminpw: fabric-ca-server的登陆密码
command: sh -c 'fabric-ca-server start -b admin:adminpw'
volumes:
- ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: ca.example.com #容器名
networks:
- basic
运行docker-compose容器
liuhui@liuhui-ThinkPad-T550:~/fabricsample$ docker-compose -f docker-compose-cli.yaml ps
Name Command State Ports
--------------------------------------------------------------------------------
ca.example.com sh -c fabric-ca-server Up 0.0.0.0:7054->7054/tcp sta ...
cli /bin/bash Up
orderer.example.com orderer Up 0.0.0.0:7050->7050/tcp
peer0.org1.example.com peer node start Up 0.0.0.0:7051->7051/tcp
peer0.org2.example.com peer node start Up 0.0.0.0:9051->9051/tcp
peer1.org1.example.com peer node start Up 0.0.0.0:8051->8051/tcp
peer1.org2.example.com peer node start Up 0.0.0.0:10051->10051/tcp
3.4、Fabric CA 命令交互
fabric-ca-server已经启动,最简单的方式是使用fabric-ca-client客户端工具进行交互
fabric-ca-client命令与服务端进行交互,包括5个子命令
- enroll :注册获取ECert
- register : 登记用户
- getcainfo : 获取CA服务的证书链
- reenroll : 重新注册
- revoke: 撤销签发的证书身份
- version:Hyperledger Fabric CA客户端版本信息
3.4.1、注册初始化管理员用户
在fabric CA服务端启动时有一个管理员用户,需要先注册初始化的管理员用户,获取注册证书以后才能进行后续的操作
- 设置fabric-ca-client所在路径
- 设置Hyperledger Fabric CA 客户端主目录
- 调用在7054端口运行的Fabric CA服务器来注册ID为admin且密码为adminpw的标识(在之前docker-compose.yaml配置文件已经指定)
export PATH=$PATH:$GOPATH/bin
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client enroll -u http://admin:pass@localhost:7054
如果名称和密码不匹配,注册会出现一下错误
Error:Response from server: Error Code: 20 - Authorization failure
执行成功后生成的文件结构如下:
liuhui@liuhui-ThinkPad-T550:~$ tree fabric-ca/clients/
fabric-ca/clients/
├── admin
│ ├── fabric-ca-client-config.yaml
│ └── msp
│ ├── cacerts
│ │ └── localhost-7054.pem
│ ├── IssuerPublicKey
│ ├── IssuerRevocationPublicKey
│ ├── keystore
│ │ ├── 813d2ffbd9a55c4ead6b5a93207412fb283f04986b3e927df49106203060f5fc_sk
│ │ └── da9b3f07279f2ca03e1002ccb10b1cf3bed485ed26f30b37491b9072a07974d4_sk
│ ├── signcerts
│ │ └── cert.pem
│ └── user
3.4.2、登记一个新用户
只有已经注册的用户才可以发起登记(register)请求,发起登记请求的用户称为登记员,登记新用户的时候还需要有相应的权限,Fabric CA服务端在接收到登记请求时需要进行如下几个方面的检查
- 登记员需要有登记用户的登记权限,登记员可以登记的用户类型记录在
hf.Registrar.Roles
属性中,如果属性保存的内容为:peer,app,user。则登记员可以登记peer,app,user类型的用户,但不能登记orderer类型的用户。- 登记员只能登记自己归属范围内的用户,比如登记员归属为a.b,可以登记归属a.b.c的用户,不能登记a.c的用户。如果不指定登记用户的归属,则默认和登记员的归属一样
- 登记的用户属性需要满足以下条件
- 登记的用户属性需要包含在登记员的用户属性“
hf.Registar.Attributes
”中,目前只支持“*“通配符,比如a.b.*表示所有a.b开头的属性名称- 如果登记的用户也有
hf.Registar.Attributes
属性,需要其是登记员用户属性hf.Registar.Attributes
的子集。比如登记员属性a.b.*,则登记用户可以为a.b.c,但不可以为a.b
接下来使用admin
的身份注册一个身份:
-
id
为admin2
-
affiliation
为org1.department1
- 属性名字为
hf.Revoker
,对应的值为true
- 属性名字为
admin
,对应的值为true
其中对于属性admin=true
,后缀为ecert
表示这条admin属性将会添加到用户注册证书中,实现访问控制。
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register --id.name admin2 --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,admin=true:ecert'
命令运行后会输出该用户密码
...
Password: LlkagjaljjgEWj
如果想使用指定的密码,则需要在命令中添加选项 --id.secret password
即可
需要注意:登记时可以将多个属性指定为 -id.attrs标志的一部分,每个属性必须以逗号分隔。对于包含逗号的属性值,必须将该属性封装在双引号中。
3.4.3、登记注册节点
登记peer或orderer节点的操作与登记用户身份类似,可以用过-M指定本地MSP的根路径以在其下存放证书文件。
- 登记一个名为peer1的节点,密码为peer1pw
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register \
--id.name peer1 \
--id.type peer \
--id.affiliation org1.department1 \
--id.secret peer1pw
- 注册节点
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
fabric-ca-client enroll \
-u http://peer1:peer1pw@localhost:7054 \
-M $FABRIC_CA_CLIENT_HOME/msp
命令成功后会在指定MSP文件下生成私钥和证书