Fabric账号
账号是什么?
Fabric中的账号实际上是根据PKI规范生成的一组证书和秘钥文件
fabric中账号的作用
- 保证记录在区块链中的数据具有不可逆、不可篡改
- Fabric中每条交易都会加上发起者的标签(签名证书),同时用发起人的私钥进行加密
- 如果交易需要其他组织的节点提供背书功能,那么背书节点也会在交易中加入自己的签名
# Fabric中的完整账号结构
.
├── [email protected]
│ ├── msp
│ │ ├── admincerts
│ │ │ └── [email protected]
│ │ ├── cacerts
│ │ │ └── ca.orggo.zjnu.com-cert.pem
│ │ ├── keystore
│ │ │ └── a2f15f92d1b1733a9a901aa4e6fa6d5910248a967b13a00521ba26068a2bc592_sk
│ │ ├── signcerts
│ │ │ └── [email protected]
│ │ └── tlscacerts
│ │ └── tlsca.orggo.zjnu.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
├── [email protected]
│ ├── msp
│ │ ├── admincerts
│ │ │ └── [email protected]
│ │ ├── cacerts
│ │ │ └── ca.orggo.zjnu.com-cert.pem
│ │ ├── keystore
│ │ │ └── 889f0029925920dcff610239140bda797e102cda8072a89e2f46c4798bdb5c1d_sk
│ │ ├── signcerts
│ │ │ └── [email protected]
│ │ └── tlscacerts
│ │ └── tlsca.orggo.zjnu.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
- msp文件夹中内容中主要存放签名用的证书文件和加密用的私钥文件。
- admincerts:管理员证书。
- cacerts:根CA服务器的证书。
- keystore:节点或者账号的私钥。
- signcerts:符合x.509的节点或者用户证书文件。
- tlscacerts:TLS根CA的证书。
- tls 文件夹中存放加密通信相关的证书文件。
启动orderer
启动orderer的时候我们需要通过环境变量或者配置文件给当前启动的Orderer设定相应的账号。
# 环境变量账号: -> 该路径为宿主机上的路径, 非docker启动的orderer节点内部挂载路径
ORDERER_GENERAL_LOCALMSPDIR=./crypto-config/ordererOrganizations/zjnu.com/orderers/orderer.zjnu.com/msp
# 账号目录信息
$ tree msp/
msp/
├── admincerts
│ └── [email protected]
├── cacerts
│ └── ca.zjnu.com-cert.pem
├── keystore
│ └── 4968fd5b3fa14639ba61ec97f745b2e0ce5592e54838493d965a08ac7ad1c8e7_sk
├── signcerts
│ └── orderer.zjnu.com-cert.pem
└── tlscacerts
└── tlsca.zjnu.com-cert.pem
启动peer
启动peer的时候我们需要通过环境变量或者配置文件给当前启动的peer设定相应的账号。
# 环境变量账号: -> 该路径为宿主机上的路径, 非docker启动的orderer节点内部挂载路径
CORE_PEER_MSPCONFIGPATH=crypto-config/peerOrganizations/orggo.zjnu.com/peers/peer0.zjnu.itcast.com/msp
# 账号目录信息
$ tree msp/
msp/
├── admincerts
│ └── [email protected]
├── cacerts
│ └── ca.orggo.zjnu.com-cert.pem
├── config.yaml
├── keystore
│ └── a3a19feb11cac708a038d115d26cf96247bcc5821bca3f2b8e9d07847604268b_sk
├── signcerts
│ └── peer0.orggo.zjnu.com-cert.pem
└── tlscacerts
└── tlsca.orggo.zjnu.com-cert.pem
创建channel
channel是fabric中的重要组成部分, 创建channel也是需要账号的.
# 环境变量账号: -> 该路径为宿主机上的路径, 非docker启动的orderer节点内部挂载路径
# 在客户端中做的, 客户端要有一个用户的账号信息
CORE_PEER_MSPCONFIGPATH=crypto-config/peerOrganizations/orggo.zjnu.com/users/[email protected]/msp
# 账号目录信息
$ tree msp/
msp/
├── admincerts
│ └── [email protected]
├── cacerts
│ └── ca.orggo.zjnu.com-cert.pem
├── keystore
│ └── a2f15f92d1b1733a9a901aa4e6fa6d5910248a967b13a00521ba26068a2bc592_sk
├── signcerts
│ └── [email protected]
└── tlscacerts
└── tlsca.orggo.zjnu.com-cert.pem
通过上边的内容我们可以发现这些账号的内容是一样的, 都包含是5个不同的文件, 但是仔细观察会发现在文件路径上还是有一些区别的。我们来对比一下:
# Orderer 启动路径
crypto-config/ordererOrganizations/itcast.com/orderers/orderer.itcast.com/msp
# Peer启动的账号路径
crypto-config/peerOrganizations/orggo.itcast.com/peers/peer0.orggo.itcast.com/msp
# 创建channel的账号路径
crypto-config/peerOrganizations/orggo.itcast.com/users/[email protected]/msp
我们可以发现Peer和Orderer都有属于自己的账号,创建Channel使用的是用户账号。其中Peer和创建Channel的用户账号属于某个组织,而Orderer的启动账号只属于他自己。这里特别注意,用户账号在很多操作中都会用到,而且很多操作的错误都是用户账号的路径设置不当而引起的。
fabric-ca 项目是专门为了解决Fabric账号问题而发起的一个开源项目, 它非常完美的解决了fabric账号生成的问题。fabric-ca项目由 fabric-server 和fabric-client这两个模块组成。其中fabric-server在 fabric中占有非常重要的作用。我们使用
cryptogen
命令可以同配置文件生成一些账号信息, 但是如果有动态添加账号的需求, 就无法满足, 所以这个时候我们就应该在项目中引入fabric-ca。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-62761Yqj-1586783193113)(assets/1542288702905.png)]
上图中Fabric CA提供了两种访问方式调用Server服务
- 通过Fabric-Client调用
- 通过SDK调用 (node.js,java, go)
通常情况下, 一个组织会对应一个fabric-server服务器, 下面介绍如何将fabric-server加入到网络中
在一个fabric中有多个组织, fabric-Ca如何部署?
- 要在每个组织中部署一个fabric-ca服务器, 给当前组织注册新用户
在docker-compose启动使用的配置文件docker-compos.yam
中添加如下配置项:
services:
###################### 添加的内容 - START #########################
cago.zjnu.com: # -> fabric-ca的服务器名, 随便起名
image: hyperledger/fabric-ca:latest # fabric-ca的镜像文件
environment:
# fabric-ca容器中的home目录
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=cago.zjnu.com # fabric-ca服务器的名字, 自己起
# fabric-ca服务器证书文件目录中的证书文件
# 明确当前fabric-ca属于哪个组织
- FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.orggo.zjnu.com-cert.pem
# fabric-ca服务器的私钥文件
- FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/0445f3d2287580194cb96060b644e560627b180315444fe2c17cbbbfda281c8a_sk
ports:
- 7054:7054 # fabric-ca服务器绑定的端口
# 启动fabric-ca-server服务
# admin:123456
# -- admin: fabric-ca-server的登录用户名
# -- 123456: fabric-ca-server的登录密码
command: sh -c 'fabric-ca-server start -b admin:123456'
volumes:
- ./crypto-config/peerOrganizations/orggo.zjnu.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: cago.zjnu.com # 容器名, 自己指定
networks:
- byfn # 工作的网络
cacpp.zjnu.com: # -> fabric-ca的服务器名, 随便起名
image: hyperledger/fabric-ca:latest # fabric-ca的镜像文件
environment:
# fabric-ca容器中的home目录
- FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
- FABRIC_CA_SERVER_CA_NAME=cacpp.zjnu.com # fabric-ca服务器的名字, 自己起
# fabric-ca服务器证书文件目录中的证书文件
# 明确当前fabric-ca属于哪个组织
- FABRIC_CA_SERVER_CA_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.orgcpp.zjnu.com-cert.pem
# fabric-ca服务器的私钥文件
- FABRIC_CA_SERVER_CA_KEYFILE=/etc/hyperledger/fabric-ca-server-config/eec404e69e144a435abc14caaff1a7adac42f5b63f0a745e22e53fca15ee4adb_sk
ports:
- 8054:7054 # fabric-ca服务器绑定的端口
# 启动fabric-ca-server服务
# admin:123456
# -- admin: fabric-ca-server的登录用户名
# -- 123456: fabric-ca-server的登录密码
command: sh -c 'fabric-ca-server start -b admin:123456'
volumes:
- ./crypto-config/peerOrganizations/orgcpp.zjnu.com/ca/:/etc/hyperledger/fabric-ca-server-config
container_name: cacpp.zjnu.com # 容器名, 自己指定
networks:
- byfn # 工作的网络
###################### 添加的内容 - END #########################
初始化node.js项目(在服务器中创建任意一个目录然后进入里面执行下面的代码)
# 创建一个编写node.js客户端的目录, 并进入
# 1. 执行npm init 生成package.json文件, 用于保存更新项目依赖的第三方模块
# 要求输入的信息, 如果你懒, 直接回车就可以了
# package.json配置说明: https://blog.csdn.net/Aurora100/article/details/78590346
$ npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help json` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (nodejs)
version: (1.0.0)
description:
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /home/itcast/nodejs/package.json:
{
"name": "nodejs",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Is this ok? (yes)
# 接下来执行如下命令, 安装第三方依赖库:
npm install --save fabric-ca-client
npm install --save fabric-client
npm install --save grpc
# 安装过程中, 提示如下log信息, 无需理会
npm WARN [email protected] No description
npm WARN [email protected] No repository field.
客户端参考API
https://hyperledger.github.io/fabric-sdk-node/