Hyperledger Fabric入门实战(七)——Fabric-CA的介绍

1. Fabric 账号

1.1 Fabric账号

  • Fabric账号

    1. 账号是什么?

      Fabric中的账号实际上是根据PKI规范生成的一组证书和秘钥文件

    2. 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 文件夹中存放加密通信相关的证书文件。

1.2 什么地方需要 Fabric 账号

  • 启动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的启动账号只属于他自己。这里特别注意,用户账号在很多操作中都会用到,而且很多操作的错误都是用户账号的路径设置不当而引起的。

1.3 Fabric-ca

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服务器, 给当前组织注册新用户

1.3.1 将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 #########################

在这里插入图片描述
在这里插入图片描述

1.3.2 编写node.js客户端

  • 初始化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/
    
发布了28 篇原创文章 · 获赞 2 · 访问量 799

猜你喜欢

转载自blog.csdn.net/qq_39200980/article/details/105497515