Fabric账号、cryptogen和fabirc-ca
Fabric不像是Ethereum或者Bitcoin那样的公有链,其本身存在一套账号管理体系,经过授权的节点才能加入系统。
Fabric的账号体系是基于证书的,而不是传统的用户名密码的形式。
Table of Contents
1 fabric账号简介
Fabric账号是根据PKI规范(什么是PKI )生成的一组证书和密钥文件。
一个完整的Fabric账号包含如下内容:
|-- msp 主要存放签名用的证书文件和加密用的私钥文件 | |--- admincerts 管理员证书 | |--- cacerts 根CA服务器证书 | |--- keystore 节点或者账号的私钥 | |--- signcerts 符合X.509的节点或者用户证书文件 | |--- tlscacerts TLS根CA的证书 | |-- tls 存放通信相关的证书文件 | |--- ca.crt | |--- server.crt | |--- server.key
Fabric中的Orderer、Peer、客户端SDK接口、CLI接口等所有操作都需要账号,比如创建通道、部署与调用chaincode、Peer向Orderer发送请求等都需要相关账号。
2 cryptogen模块
cryptogen是Fabric的创建账号的工具之一,参考 cryptogen --help 可以查看相关命令 ,其中 cryptogen generate 根据配置文件来生成相应的证书。
2.1 配置文件
// crypto-config.yaml OrdererOrgs: // 定义orderer节点的名称 - Name: Orderer // orderer节点的名称 Domain: example.com // orderer节点的根域名 Specs: - Hostname: orderer // orderer节点的主机名 PeerOrgs: - Name: Org1 // 组织1的名称 Domain: org1.example.com // 组织1的根域名 Template: Count: 2 // 组织1中的节点数目 Users: Count: 1 // 组织1中的用户数目 - Name: Org2 // 组织2相关(类似) Domain: org2.example.com EnableNodeOUs: true Template: Count: 2 Users: Count: 1
2.2 证书结构
使用 cryptogen generate 结合上面的配置文件 crypto-config.yaml 来生成证书:
cryptogen generate --config=./crypto-config.yaml --output ./crypto-config
生成的 crypto-config/ 证书文件主要目录如下
➜ tree crypto-config/ -L 5
crypto-config/
├── ordererOrganizations
│ └── example.com
│ ├── ca
│ │ ├── c6d8e83b2a78a37eaa9a126cef5c44051312601ae3855623af83bc948921a422_sk
│ │ └── ca.example.com-cert.pem
│ ├── msp
│ │ ├── admincerts
│ │ │ └── Admin@example.com-cert.pem
│ │ ├── cacerts
│ │ │ └── ca.example.com-cert.pem
│ │ └── tlscacerts
│ │ └── tlsca.example.com-cert.pem
│ ├── orderers
│ │ └── orderer.example.com
│ │ ├── msp
│ │ └── tls
│ ├── tlsca
│ │ ├── 01130d884966737dfc484ec907e634474e8dc622881e004020c49b76bf0f3558_sk
│ │ └── tlsca.example.com-cert.pem
│ └── users
│ └── Admin@example.com
│ ├── msp
│ └── tls
└── peerOrganizations
├── org1.example.com
│ ├── ca
│ │ ├── ca.org1.example.com-cert.pem
│ │ └── e4248a5c59af05f1c0a7f9dc836f05cb6e8afc66dc43818424f501d4dc3e58f8_sk
│ ├── msp
│ │ ├── admincerts
│ │ │ └── Admin@org1.example.com-cert.pem
│ │ ├── cacerts
│ │ │ └── ca.org1.example.com-cert.pem
│ │ └── tlscacerts
│ │ └── tlsca.org1.example.com-cert.pem
│ ├── peers
│ │ ├── peer0.org1.example.com
│ │ │ ├── msp
│ │ │ └── tls
│ │ └── peer1.org1.example.com
│ │ ├── msp
│ │ └── tls
│ ├── tlsca
│ │ ├── 9f67b573a9bce34f43bf942e2794973f07062cb1ba4b8afbf1743a7a94b3d7f2_sk
│ │ └── tlsca.org1.example.com-cert.pem
│ └── users
│ ├── Admin@org1.example.com
│ │ ├── msp
│ │ └── tls
│ └── User1@org1.example.com
│ ├── msp
│ └── tls
└── org2.example.com // 略去org2相关
3 fabric-ca
使用cryptogen模块可以通过配置文件生成fabric运行所需的相关账号文件,但要是系统需要添加新组织或者组织中需要添加新账号和新用户那怎么办?
3.1 解决方法1-修改已有配置
查看目前已有的 peer
➜ tree ./crypto-config/peerOrganizations/org1.example.com/ -L 2
./crypto-config/peerOrganizations/org1.example.com/
├── ca
│ ├── ca.org1.example.com-cert.pem
│ └── e225f8d180e31740012cd858c5b024dc891c160b9cbc0b268e873545a17d21d9_sk
├── msp
│ ├── admincerts
│ ├── cacerts
│ └── tlscacerts
├── peers
│ ├── peer0.org1.example.com
│ └── peer1.org1.example.com
├── tlsca
│ ├── 813a35c73119548ce6f6050e96045113dd8defe02e8e0c0072d6bb83efbe11b9_sk
│ └── tlsca.org1.example.com-cert.pem
└── users
├── Admin@org1.example.com
└── User1@org1.example.com
12 directories, 4 files
修改配置文件
OrdererOrgs:
- Name: Orderer
Domain: example.com
Specs:
- Hostname: orderer
PeerOrgs:
- Name: Org1
Domain: org1.example.com
Template:
Count: 5 // 改成了5个
Users:
Count: 1
- Name: Org2
Domain: org2.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
使用 cryptogen extend 添加peer
➜ cryptogen extend --config=./crypto-config.yaml
再次查看组织1中已有的peer
➜ tree ./crypto-config/peerOrganizations/org1.example.com/ -L 2
./crypto-config/peerOrganizations/org1.example.com/
├── ca
│ ├── ca.org1.example.com-cert.pem
│ └── e225f8d180e31740012cd858c5b024dc891c160b9cbc0b268e873545a17d21d9_sk
├── msp
│ ├── admincerts
│ ├── cacerts
│ └── tlscacerts
├── peers
│ ├── peer0.org1.example.com
│ ├── peer1.org1.example.com
│ ├── peer2.org1.example.com
│ ├── peer3.org1.example.com
│ └── peer4.org1.example.com
├── tlsca
│ ├── 813a35c73119548ce6f6050e96045113dd8defe02e8e0c0072d6bb83efbe11b9_sk
│ └── tlsca.org1.example.com-cert.pem
└── users
├── Admin@org1.example.com
└── User1@org1.example.com
15 directories, 4 files
缺点: 无法动态增加
3.2 解决方法2-采用fabric-ca动态管理
Fabric-ca是专门为解决Fabric账号问题而发起的一个开源项目,包括fabric-ca-server和fabric-ca-client。
添加图片: https://hyperledger-fabric-ca.readthedocs.io/en/latest/users-guide.html#overview
fabric-ca-server负责和系统交互,管理认证服务,可以通过fabric-ca-client或者实现其通信协议的客户端与其交互。
fabric可以从命令行或者配置文件启动,配置文件包括以下主要配置:
3.2.1 ca
ca: name: ca-org1 // CA的名字 keyfile: ca-key.pem // 私钥文件 certfile: ca-cert.pem // 证书文件 chainfile: ca-chain.pem // 证书链文件
假设要将fabric server绑定到现有项目中,即修改此处ca选项为相应组织中的证书和私钥,如下:
ca: name: // CA的名字 keyfile: e225f8d180e31740012cd858c5b024dc891c160b9cbc0b268e873545a17d21d9_sk certfile: ca.org1.example.com-cert.pem chainfile: ca-chain.pem // 证书链文件
3.2.2 db
db部分指定fabric-server存储账号文件的数据类型,目前只取sqlite3,postgresql和mysql
通过客户端fabric-ca-client可以从已经绑定的fabric-server新建一个用户账号
实际中更多的应用场景是通过客户端程序(比如SDK)来和fabric-ca-server提供的RESTAPI接口交互来完成账号注册、账号登记等操作。