Published: 2018-06-19

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接口交互来完成账号注册、账号登记等操作。

Author: Nisen

Email: imnisen@163.com