Hyperledge Fabric-身份与角色认证

Posted 王永俊

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hyperledge Fabric-身份与角色认证相关的知识,希望对你有一定的参考价值。

简述

我们之前讲过区块链主要分为公有链、联盟链以及私有链,其中公有链为非许可链,联盟链和私有链为许可链。尤其是联盟链,身份是联盟链区别与公链的一个最重要特征。在公链中是没有身份这个概念的,每个节点都是相同的角色。而fabric身份是联盟链中最重要的概念,甚至可以没有之一。联盟链中的身份确定了对资源的确切权限以及对参与者在区块链网络中拥有的信息的访问权限。
此外,数字身份还具有 Fabric 用于确定权限的一些其他属性,并且它为身份和关联属性的并集提供了特殊名称——主体 。主体就像 userID 或 groupID,但更灵活一点,因为它们可以包含参与者的身份的各种属性,例如参与者的组织,组织单位,角色甚至是参与者的特定身份。当我们谈论主体时,它们是决定其权限的属性。

角色分类

整个网络中分为几种角色:peer节点(提交节点和背书节点),证书颁发机构CA,其中成员服务提供者(Membership Service Provider, MSP)是一个可信任的权威机构,它不是fabric中的角色,但是为fabric中的节点提供可信的身份认证。fabric中,默认的MSP实现使用X.509证书(使用最广泛的证书结构标准,包括证书信息/签名算法/数字签名等内容)作为身份,采用公钥基础结构(Pubic Key Infrastructure, PKI)作为分层模型。PKI 是身份供应商,为接入区块链网络的用户提供一个身份列表,用户的身份只能在身份列表的包含范围内选择;而MSP是接受身份供应商,会提供一个列表来确定哪些身份是可信的成员(也就是参与者)。

身份的使用-举例

官方用杂货店接收的信用卡类型来解释MSP和PKI的作用,但是在国内,我感觉用银联、支付宝、微信等支付手段更恰当。假设之前你在京东购物你会发现,当你结账的时候,支付提示有银联卡、微信支付以及京东支付,而没有支付宝的选项,无论你支付宝是否实名认证了,是否有足够的的资金,你都无法使用支付宝付款。也就是你的支付宝是否合法是不够的,它还必须被京东或者超市接受!PKI 和 MSP 以相同的方式协同工作,PKI提供身份列表,MSP说哪些是参与网络的给定组织的成员。

PKI和MSP

PKI 证书和 MSP 提供了类似的功能组合。PKI 就像一个支付提供商,它分配了许多不同类型的可验证身份。另一方面,MSP 类似于京东(超市)接受的卡支付商列表,确定哪些支付方式是京东(商店)支付网络的可信成员(参与者)。MSP 将可验证的身份转变为区块链网络的成员 。

什么是 PKI?

公钥基础结构(PKI)是一组互联网技术,可在网络中提供安全通信。是 PKI 将 S 放在 HTTPS 中,如果你在网页浏览器上阅读这个文档,你可能正使用 PKI 来确保它来自一个验证过的来源。

公钥基础结构(PKI)的元素。PKI 由向各方(例如,服务的用户,服务提供者)发布数字证书的证书授权中心组成,然后使用它们在与其环境交换的消息中对自己进行身份验证。CA 的证书撤销列表(CRL)构成不再有效的证书的参考。证书的撤销可能由于多种原因而发生。例如,因为与证书相关联的加密私有材料已被公开,所以证书可能被撤销。

虽然区块链网络不仅仅是一个通信网络,但它依赖于 PKI 标准来确保各个网络参与者之间的安全通信,并确保在区块链上发布的消息得到适当的认证。因此,了解 PKI 的基础知识以及为什么 MSP 是非常重要的。

PKI 有四个关键要素:

数字证书

公钥和私钥

证书授权中心

证书撤销列表

数字证书

数字证书是包含与证书持有者相关的属性的文档。最常见的证书类型是符合 X.509标准的证书,它允许在其结构中编码一些用于身份识别的信息。

例如,密歇根州底特律的 Mitchell 汽车的制造部门的 Mary Morris 可能有一个带有 SUBJECT 属性为 C=US, ST=Michigan, L=Detroit, O=Mitchell Cars, OU=Manufacturing, CN=Mary Morris /UID=123456 的数字证书。Mary 的证书类似于她的身份证(提供了 Mary 的信息),她可以用来证明关于她的重要事实。X.509 证书中还有许多其他属性,但现在让我们专注于这些。

描述一个名为 Mary Morris 的组织的数字证书。Mary 是证书的 SUBJECT,突出显示的 SUBJECT 文本显示了关于 Mary 的重要事实。如你所见,证书还包含更多信息。最重要的是,Mary 的公钥是在她的证书中分发的,而她的私人签名密钥则不是。此签名密钥必须保密。

重要的是,Mary 的所有属性都可以使用称为密码学(字面意思,“ 秘密书写 ”)的数学技术进行记录,这样篡改将使证书无效。只要对方信任证书颁发者,即证书授权中心(CA),密码学就允许 Mary 将证书提交给其他人以证明其身份。只要 CA 安全地保存某些加密信息(CA 的私钥),任何阅读证书的人都可以确定有关 Mary 的信息没有被篡改,它将始终具有 Mary Morris 的特定属性。将 Mary 的 X.509 证书视为无法改变的数字身份证。

授权,公钥和私钥

身份验证和消息完整性是安全通信中的重要概念。身份验证要求确保交换消息的各方创建特定消息的身份。对于具有“完整性”的消息意味着在其传输期间不能被修改。例如,你可能希望确保与真正的 Mary Morris 而不是模仿者进行沟通。或者,如果 Mary 向你发送了一条消息,你可能希望确保其在传输过程中没有被其他任何人篡改过。

传统的身份验证机制依赖于数字签名,顾名思义,它允许一方对其消息进行数字签名。数字签名还可以保证签名消息的完整性。

从技术上讲,数字签名机制要求每一方保存两个加密连接的密钥:广泛可用的公钥和充当授权锚的私钥,以及用于在消息上产生数字签名的私钥 。数字签名消息的接收者可以通过检查附加签名在预期发送者的公钥下是否有效来验证接收消息的来源和完整性。

私钥和公钥的唯一关系是保证安全通信的加密魔法。密钥之间唯一的数学关系使得私钥在消息上的签名,只有对应公钥在相同的消息上才可以与之匹配。

在上面的示例中,Mary 使用她的私钥对邮件进行签名。任何使用她的公钥查看签名消息的人都可以验证签名。

证书授权中心

如你所见,人员或节点能够通过由系统信任的机构为其发布的数字身份参与区块链网络。在最常见的情况下,数字身份(或简称身份)的形式为,符合 X.509 标准并由证书授权中心(CA)颁发的经加密验证的数字证书。

CA 是互联网安全协议的常见部分,你可能已经听说过一些比较流行的协议:Symantec(最初是 Verisign),GeoTrust,DigiCert,GoDaddy 和 Comodo 等。

证书授权中心向不同的参与者颁发证书。这些证书由 CA 进行签名,并将参与者的公钥绑定在一起(并且可选是否具有全部属性列表)。因此,如果一个成员信任 CA(并且知道其公钥),则可以信任与参与者绑定的证书中包含的公钥,并通过验证参与者证书上的 CA 签名来获取所包含的属性。

证书可以广泛传播,因为它们既不包括参与者也不包括 CA 的私钥。因此,它们可以用作信任的锚,用于验证来自不同参与者的消息。

CA 也有一个证书,它们可以广泛使用。这就可以让从给定 CA 获取身份证书的消费者验证自己的身份,因为只有对应的私钥才可以生成该证书。

在区块链设置中,希望与网络交互的每个参与者都需要一个身份。在此设置中,你可能会说使用一个或多个 CA 从数字角度定义了组织的成员 。CA 是为组织的参与者提供可验证的数字身份的基础。

根 CA,中间 CA 和信任链
CA 有两种形式:根 CA和中间 CA 。因为根 CA(Symantec,Geotrust等)必须安全地向互联网用户颁发数亿个证书,所以将这个过程分散到所谓的中间 CA 中是很有用的。这些中间 CA 具有由根 CA 或其他中间 CA 颁发的证书,允许为链中的任何 CA 颁发的任何证书建立“信任链”。追溯到根 CA 的能力不仅让 CA 的功能在仍然提供安全性的同时进行扩展(允许使用证书的组织充满信心地使用中间 CA),还限制了根 CA 的暴露,如果根 CA 受到损害,将会危及整个信任链。另一方面,如果中间 CA 受到损害,则曝光量会小得多。

只要每个中间 CA 的证书的颁发 CA 是根 CA 本身或具有对根 CA 的信任链,就在根 CA 和一组中间 CA 之间建立信任链。

中间 CA 在跨多个组织颁发证书时提供了巨大的灵活性,这在许可的区块链系统(如Fabric)中非常有用。例如,你将看到不同的组织可能使用不同的根 CA,或者使用具有不同中间 CA 的相同根 CA,这取决于网络的需求。

Fabric CA
因为 CA 非常重要,Fabric 提供了一个内置的 CA 组件,允许在你的区块链网络中创建 CA。此组件称为 Fabric CA ,是一个私有根 CA 提供者,能够管理具有 X.509 证书形式的 Fabric 参与者的数字身份。由于 Fabric CA 是针对 Fabric 的根 CA 需求的自定义 CA,因此它本身无法为浏览器中的常规或自动使用提供 SSL 证书。但是,由于一些 CA 必须用于管理身份(即使在测试环境中),因此可以使用 Fabric CA 来提供和管理证书。使用公共或商业的根或中间 CA 来提供识别也是可以的,并且完全合适。

证书撤销列表

证书撤销列表(Certificate Revocation List,CRL)很容易理解,它是 CA 知道由于某些原因而被撤销的证书的引用列表。如果你回想商店场景,CRL 就像被盗信用卡列表一样。

当第三方想要验证另一方的身份时,它首先检查颁发 CA 的 CRL 以确保证书尚未被撤销。验证者不是必须要检查 CRL,但如果不检查,则他们冒着接受无效身份的风险。

总结

Hyperledge Fabric的身份认证体系是整个组件化中的重要组成部分,一般联盟的组建会选择市面上比较权威的身份认证公司来提供。他是保证组织安全和数据安全的重要手段。

ubuntu 18.04 搭建hyperledge-fabric 2.x网络和fabric-explorer

文章目录


本文详细说明在 ubuntu 18.04环境下搭建 fabric 2.x环境和 fabrix-explorer的过程。

1、前期工具准备

1.1 Git安装

$ apt-get update
$ apt-get install git

1.2 cURL安装

$ apt-get install curl

1.3 docker 安装

先卸载老版本的docker

$ sudo apt-get remove docker docker-engine docker.io containerd runc

安装辅助包:

$ sudo apt-get install \\
    ca-certificates \\
    curl \\
    gnupg \\
    lsb-release

添加dockerGPR密钥:

$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

设置存储库:

$ echo \\"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \\
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

安装docker 引擎:

$ sudo apt-get update
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin

列出存储库可用的版本:

$ apt-cache madison docker-ce


下载指定版本的docker ,<VERSION_STRING>5:20.10.16~3-0~ubuntu-jammy 替代:

$ sudo apt-get install docker-ce=<VERSION_STRING> docker-ce-cli=<VERSION_STRING> containerd.io docker-compose-plugin

验证docker 是否安装正确:

$ sudo docker run hello-world

查看docker 版本:

$ docker -v

配置修改阿里云镜像仓库:

进入阿里云官网-控制台-容器镜像服务-镜像工具-镜像加速器 获取加速地址

$ sudo mkdir -p /etc/docker
$ sudo tee /etc/docker/daemon.json <<-'EOF'

  "registry-mirrors": ["加速器地址"]

EOF
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

安装docker-compose

尽量安装高版本的,不然后面创建channel时会报错。

下载docker-compose1.25.4

$ curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.4/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#将可执行权限应用于二进制文件
$ chmod +x /usr/local/bin/docker-compose
#创建软链
$ ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
#查询版本号
$ docker-compose -v
$ docker-compose version 1.25.4, build 8d51620a

1.4 安装Go

下载go语言安装包:

$ wget https://studygolang.com/dl/golang/go1.15.5.linux-amd64.tar.gz
#解压
$ tar -C /usr/local -xzf go1.15.5.linux-amd64.tar.gz

配置:

## 创建go目录
$ mkdir $HOME/go
## 设置环境变量
$ vi ~/.bashrc
## 在文末加上,其中GOPATH 是存放 Go 项目的目录;GOROOT 是 Go 的安装包所在目录。
$ export GOROOT=/usr/local/go
$ export GOPATH=$HOME/go
$ export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
## 使配置的环境变量生效
$ source ~/.bashrc

# 查看go的版本
$ go version
$ go version go1.15.5 linux/amd64

# 构建go项目目录
## src:存放源代码的目录。
## bin:存放生成后的可执行文件和 Go 相关的工具。
## pkg:存放编译后的包文件。

2 下载 fabric 和 fabric-ca

2.1 clone fabric-sample:

# 创建存放源代码的目录,并进入
$ mkdir -p $GOPATH/src/github.com/hyperledger
$ cd $GOPATH/src/github.com/hyperledger
# 从gitee上克隆代码
$ git clone https://gitee.com/hyperledger/fabric-samples.git
# 进入目录,切换分支
$ cd fabric-samples
# 查看所有分支
$ git branch -a
# 切换到主分支
$ git checkout master

2.2 拉取 fabric 二进制文件:

# 下载所需的二进制文件
## 要注意版本的兼容性,这边下载的是fabric 2.4.0和fabric-ca 1.5.0
$ wget https://github.com/hyperledger/fabric/releases/download/v2.4.0-alpha/hyperledger-fabric-linux-amd64-2.4.0-alpha.tar.gz
$ wget https://github.com/hyperledger/fabric-ca/releases/download/v1.5.0/hyperledger-fabric-ca-darwin-amd64-1.5.0.tar.gz

# 解压二进制文件,并放入fabric-sample目录下
$ tar -C $GOPATH/src/github.com/hyperledger/fabric-samples -xzf hyperledger-fabric-linux-amd64-2.4.0-alpha.tar.gz
$ tar -C $GOPATH/src/github.com/hyperledger/fabric-samples -xzf hyperledger-fabric-ca-darwin-amd64-1.5.0.tar.gz

拉取过程可能很慢,可以自己本地下载后上使用 scp上传到 ubuntu

2.3 拉取fabric所需的镜像

官方bootstrap.sh

# 在hyperledger目录下新建bootstrap.sh
$ cd $GOPATH/src/github.com/hyperledger
$ touch bootstrap.sh
# 将官方脚本中拉取镜像全部复制进来
$ vim bootstrap.sh

注释后面两个if


运行bootstrap.sh脚本:

$ chmod +x bootstrap.sh
$ ./bootstrap.sh

3 测试用例

3.1 启用fabric自带的网络测试来测试环境是否装好:

#进入测试用例路径
$ cd facric-samples/test-network
#启动测试
$ ./network.sh up

启动成功会创建两个组织节点和一个排序节点:

注:使用 docker ps -a 查看容器是否启动,若是容器启动后秒退,说明fabric镜像没有拉取全。

3.2 创建channel

$ ./network.sh createChannel

出现这个则说明创建成功。

3.3 关闭测试网络

$ ./network.sh down

4 设置环境变量

fabric-samples/bin 加入环境变量 方便使用。

#添加环境变量
$ vim ~/.bashrc
#在最后一行加入
$ export PATH=$PATH:$GOROOT/bin:$GOPATH/bin:$HOME/go/src/github.com/hyperledger/fabric-samples/bin
#使配置生效
$ source ~/.bashrc
#验证是否生效
$ fabric-ca-client version
#看是否有输出 若是没有则重启虚拟机试试

5 fabric explorer安装

使用 docker 镜像部署,前提是已经装好fabric 网络。

创建目录:

#进入指定目录
$ cd  go/src/github.com/hyperledger

$ mkdir explorer
$ cd explorer

拉取配置文件到目录下:

$ wget https://raw.githubusercontent.com/hyperledger/blockchain-explorer/main/examples/net1/config.json
$ wget https://raw.githubusercontent.com/hyperledger/blockchain-explorer/main/examples/net1/connection-profile/test-network.json -P connection-profile
$ wget https://raw.githubusercontent.com/hyperledger/blockchain-explorer/main/docker-compose.yaml

从结构网络复制整个加密工件目录(组织/)(例如/fabric-samples/test-network):

$ cp -r ../fabric-samples/test-network/organizations/ .

此时的目录结构:

docker-compose.yaml
config.json
connection-profile/test-network.json
organizations/ordererOrganizations/
organizations/peerOrganizations/

查看fabric网络的名称:

$ docker network ls

网络名称为:fabric_test

编辑配置文件 docker-compose.yaml

$ vim docker-commpose.yaml
# SPDX-License-Identifier: Apache-2.0
version: '2.1'

volumes:
  pgdata:
  walletstore:

networks:
  mynetwork.com:
      external:             # 自己添加
        name: fabric_test   #此处为fabric 名称 要对应

services:

  explorerdb.mynetwork.com:    # 不修改
    image: hyperledger/explorer-db:latest
    container_name: explorerdb.mynetwork.com
    hostname: explorerdb.mynetwork.com
    environment:
      - DATABASE_DATABASE=fabricexplorer
      - DATABASE_USERNAME=hppoc
      - DATABASE_PASSWORD=password
    healthcheck:
      test: "pg_isready -h localhost -p 5432 -q -U postgres"
      interval: 30s
      timeout: 10s
      retries: 5
    volumes:
      - pgdata:/var/lib/postgresql/data
    networks:
      - mynetwork.com

  explorer.mynetwork.com:
    image: hyperledger/explorer:latest
    container_name: explorer.mynetwork.com
    hostname: explorer.mynetwork.com
    environment:
      - DATABASE_HOST=explorerdb.mynetwork.com
      - DATABASE_DATABASE=fabricexplorer
      - DATABASE_USERNAME=hppoc
      - DATABASE_PASSWD=password
      - LOG_LEVEL_APP=info
      - LOG_LEVEL_DB=info
      - LOG_LEVEL_CONSOLE=debug
      - LOG_CONSOLE_STDOUT=true
      - DISCOVERY_AS_LOCALHOST=false    #通过网桥网络将 Explorer 连接到结构网络时,需要设置为 禁用到 localhost 的主机名映射。
      - PORT=$PORT:-8080  #浏览器端口
    volumes:          # 一下内容 照样修改
          - ./config.json:/opt/explorer/app/platform/fabric/config.json
          - ./connection-profile:/opt/explorer/app/platform/fabric/connection-profile
          - ./organizations:/tmp/crypto
          - walletstore:/opt/explorer/wallet
    ports:
      - $PORT:-8080:$PORT:-8080
    depends_on:
      explorerdb.mynetwork.com:
        condition: service_healthy
    networks:
      - mynetwork.com

修改test-network.json 配置文件


        "name": "test-network",   
        "version": "1.0.0",
        "client": 
                "tlsEnable": true,
                "adminCredential":     #浏览器登录时的账号和密码 可以修改为自己想要的
                        "id": "exploreradmin",
                        "password": "null"
                ,
                "enableAuthentication": true,
                "organization": "Org1MSP",
                "connection": 
                        "timeout": 
                                "peer": 
                                        "endorser": "300"
                                ,
                                "orderer": "300"
                        
                
        ,
        "channels": 
                "mychannel": 
                        "peers": 
                                "peer0.org1.example.com": 
                        
                
        ,
        "organizations": 
                "Org1MSP": 
                        "mspid": "Org1MSP",
                        # 这部分一定要修改 否则会启动失败
                        "adminPrivateKey": 
                                # 原为 "path": "/tmp/crypto/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/priv_sk"
                                "path": "/tmp/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/priv_sk"
                        ,
                        "peers": ["peer0.org1.example.com"],
                        "signedCert": 
                                # 原为 "path": "/tmp/crypto/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem"
                                "path": "/tmp/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem"
                        
                
        ,
        "peers": 
                "peer0.org1.example.com": 
                        "tlsCACerts": 
                                "path": "/tmp/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt"
                        ,
                        "url": "grpcs://peer0.org1.example.com:7051"
                
        

在启动之前还需要在fabric的测试网络中创建通道,通道名称就用默认的 channel

启动容器服务:

$ docker-compose up -d

停止服务:

  1. 若要在不删除持久性数据的情况下停止服务,请运行以下命令:
$ docker-compose down
  1. docker-compose.yaml 中,为持久性数据(Postgres 数据和用户钱包)分配了两个命名卷。如果要清除这些命名卷,请运行以下命令:
$ docker-compose down -v

在浏览器输入ip:8080 就可访问fabric-explorer

部分错误排除

# 查看container 是否在运行
$ docker ps -a  
# 查看容器输出日志
$ docker logs -f [container-name\\ID]

出现钱包创建失败则重点查看test-network.json文件"adminPrivateKey""signedCert"path是否修改正确。
出现channel 连接失败则先创建channel 在启动explorer

ps:如有不正之处欢迎指出!!!

以上是关于Hyperledge Fabric-身份与角色认证的主要内容,如果未能解决你的问题,请参考以下文章

VMware 中 Centos7 安装 Hyperledge Fabric v2.3 测试网络

Hyperledger Fabric中的Identity

fabric配置详解

fabric1.0学习笔记

Hyperledger Fabric SDK设计/应用程序的角色

Fabric1.0架构与设计