Fabric—Ca的概念不再解释了,这里只说明使用方法:

前置条件

  • Go语言1.10+版本
  • GOPATH环境变量正确设置
  • 已安装libtoollibtdhl-dev

Ubuntu系统

通过以下命令安装libtoollibtdhl-dev包:

sudo apt install libtool libltdl-dev

MacOs 系统

Mac系统通过以下命令安装:

brew install libtool

Fabric-Ca安装

可以通过以下两种途径进行安装:

  1. 直接下载二进制文件:
go get -u github.com/hyperledger/fabric-ca/cmd/...

如果使用这种方式安装,安装成功的话直接在命令行输入(前提是GOPATH正确配置):

fabric-ca-server version

即可打印出安装的Ca版本。

2. 从源码编译安装:

首先在系统中建立以下路径:

mkdir -p $GOPATH/src/github.com/hyperledger/
cd $GOPATH/src/github.com/hyperledger/

从Github上面将Fabric-Ca仓库克隆到本地:

git clone https://github.com/hyperledger/fabric-ca.git
cd fabric-ca

进行源码编译:

make fabric-ca-server
make fabric-ca-client

如果没有报错的话,当前文件下会编译出一个bin文件夹,最后一步将该文件夹添加到环境变量,安装完成!

编译Ca的Docker镜像

直接在fabric-ca文件夹内执行以下命令:

make docker

Fabric-Ca服务器简单使用


设置Fabric Ca服务器的Home文件夹

启动Fabric Ca 服务器的第一步是需要对Fabric Ca服务器进行初始化操作,初始化操作将会生成一些默认的配置文件,所以我们首先需要指定一个文件夹作为服务器的主文件夹用来放生成的配置文件。

可以通过以下几种方式设置Fabric-Ca服务器的主文件夹,优先级由高到低排序:

  1. 通过命令行设置参数--home设置。
  2. 如果设置了FABRIC_CA_SERVER_HOME环境变量,则使用该环境变量作为主文件夹。
  3. 如果设置了FABRIC_CA_HOME环境变量,则使用该环境变量作为主文件夹。
  4. 如果设置了CA_CFG_PATH环境变量,则使用该环境变量作为主文件夹。
  5. 如果以上方法都没有设置,则将当前工作目录作为主文件夹。

官方建议是通过设置FABRIC_CA_HOME$HOME/fabric-ca/server作为服务器的主文件夹。

初始化服务器

上一步骤完成后,就可以对Fabric Ca进行初始化了,执行以下命令:

fabric-ca-server init -b admin:adminpw

通过-b参数指定管理员的账号和密码对服务器进行初始化。将会生成一个自签名的证书。

  • admin:相当于管理员账号
  • adminpw:相当于管理员密码

admin:adminpw可以自行设置。

或者服务器的初始化也可以通过-u参数指定服务器的上一级服务器,也就是父服务器。格式为:-u <parent-fabric-ca-server-URL,其中这里的URL必须使用<协议>://<enrollmentId>:<secret>@<host>:<port>的格式。

初始化之后将会生成几个文件:

IssuerPublicKey      #与零知识证明相关文件,暂不解释
IssuerRevocationPublicKey #与零知识证明相关文件,暂不解释
ca-cert.pem #CA服务器的根证书文件,只有持有该证书,用户才可以进行证书的颁发
fabric-ca-server-config.yaml #默认配置文件,对Ca服务器进行配置时可以用到
fabric-ca-server.db #Ca服务器数据库,存储注册的用户,组织,证书等信息。可以通过sqlite3 命令进去查看
msp/

启动服务器

初始化之后可以直接启动服务器:

fabric-ca-server start -b <admin>:<adminpw>

服务器将会监听在7054端口。如果需要服务器监听在https上而不是http上,需要将tls.enabled设置为true

启动完之后,即可以通过fabric-ca-client工具或者是SDK对Ca服务器进行操作了。

Fabric Ca 客户端

这一部分说明命令行工具fabric-ca-client的简单使用。

设置Fabric Ca客户端的Home文件夹

与服务器相同,客户端也具有自己的主文件夹,用来保存客户端的证书秘钥等等。

可以通过以下几种方式设置Fabric-Ca客户端的主文件夹,优先级由高到低排序:

  1. 通过命令行设置参数--home设置。
  2. 如果设置了FABRIC_CA_CLIENT_HOME环境变量,则使用该环境变量作为主文件夹。
  3. 如果设置了FABRIC_CA_HOME环境变量,则使用该环境变量作为主文件夹。
  4. 如果设置了CA_CFG_PATH环境变量,则使用该环境变量作为主文件夹。
  5. 如果以上方法都没有设置,则$HOME/.fabric-ca-client将作为主文件夹。

官方例子:export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin

用户登陆

设置完之后,我们使用命令行工具登陆管理员用户:

fabric-ca-client enroll -u http://admin:adminpw@localhost:7054

admin目录下会产生以下文件:

.
├── fabric-ca-client-config.yaml
└── msp
├── IssuerPublicKey
├── IssuerRevocationPublicKey
├── cacerts
│   └── localhost-7054.pem #CA服务器的根证书,只不过换了一个名字
├── keystore
│   └── 7ec84cbc25c20600ba98bf2bafb9c695ad57e392a57fb9f33b51fc493601a432_sk #当前用户的秘钥信息
├── signcerts
│   └── cert.pem #当前用户的证书
└── user

注册一个身份

通过Fabric-CA注册新的身份时,将由Fabric-CA服务器进行三个部分的权限检查确定当前用户是否具有权限进行身份的注册。

  1. 注册者必须含有hf.Registrar.Roles属性,并且需要注册的身份类型必须在该属性对应的值的列表中存在。比如注册者的hf.Registrar.Roles属性中对应的值只有一个peer,那么注册者使能注册类型为peer的身份,而不能注册client,admin,orderer.如果注册者的hf.Registrar.Roles属性对应的值为*,则说明可以注册任何类型的身份。
  2. 简单说就是上下级关系,比如注册者所处的部门为a.b,那么他只能注册处于a.b以及a.b.*部门的身份,而不能注册处于a.c部门的身份。如果需要注册一个最上级的部门的身份,那么需要将需要将需要注册的身份的hf.affiliation指定为.,并且注册者所处的部门也需要是最上级的部门。如果在注册身份时没有指定所属的部门,则默认被注册的身份所处的部门与注册者部门相同。
  3. 如果注册者满足以下条件则可以注册带有属性的身份:
    • 对于Fabric CA中的保留属性(前缀以hf开头的):只有注册者具有这个属性并且是hf.Registrar.Attributes属性中的值得一部分。也就是说如果需要注册一个带有hf.a属性的身份,那么注册者自己也需要有这个属性,并且在注册者的hf.Registrar.Attributes属性对应的值中需要包含hf.a这个属性。并且hf.a这个属性的值是一个列表,那么被注册的身份具有的hf.a属性只能等于或者等于列表中的一个子集。另外,如果hf.a这个属性的值对应的是一个布尔值,那么需要注册者hf.a属性的值为true
    • 对于注册者自定义的属性(不是Fabric Ca中的保留属性):注册者hf.Registrar.Attributes对应的值需要包括这个属性,或者是已经注册过的模式。唯一支持的模式是以*结尾的字符串。比如注册者hf.Registar.Attributes对应的值为a.b.*,那么他可以注册的属性需要以a.b.开头。如果注册者hf.Registar.Attributes对应的值为orgAdmin,那么注册者只可以对一个身份进行添加或者删除orgAdmin属性.
    • 对于hr.Registrar.Attributes属性:一个额外的检查是该属性对应的值需要等于注册者具有的该属性对应的值,或者是注册者具有的该属性对应的值的子集。

接下来使用admin的身份注册一个身份:

  • enrollment idadmin2
  • 部门为org1.department1
  • 属性名字为hf.Revoker,对应的值为true
  • 属性名字为admin,对应的值为true
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register \
--id.name admin2 \
--id.affiliation org1.department1 \
--id.attrs 'hf.Revoker=true,admin=true:ecert'

其中对于属性admin=true,后缀为ecert表示这条属性将会添加到证书中,可以用来进行做访问控制的决定。

对于多个属性,可以使用--id.attrs参数标记,并使用单引号括起来,每个属性使用逗号分隔开:

fabric-ca-client register -d \
--id.name admin2 \
--id.affiliation org1.department1 \
--id.attrs '"hf.Registrar.Roles=peer,client",hf.Revoker=true'

或者是:

fabric-ca-client register -d \
--id.name admin2 \
--id.affiliation org1.department1 \
--id.attrs '"hf.Registrar.Roles=peer,client"' \
--id.attrs hf.Revoker=true

或者是通过客户端配置文件fabric-ca-client-config.yaml

id:
name:
type: client
affiliation: org1.department1
maxenrollments: -1
attributes:
- name: hf.Revoker
value: true
- name: anotherAttrName
value: anotherAttrValue

接下来的命令是通过以上的配置文件注册一个身份:

  • enrollment idadmin3
  • 身份类型为client
  • 部门为org1.department1
  • 属性名字为hf.Revoker,对应的值为true
  • 属性名字为anotherAttrName,对应的值为anotherAttrValue

设置maxenrollments为0或者是不设置将导致该身份可以使用CA的最大enrollment次数。并且一个身份的maxenrollments不能超过CAenrollments最大值。例如,如果CAenrollment最大值为5,则任何新的身份必须含有一个小于等于5的值。并且也不能设置为-1(-1表示无限制).

接下来注册一个peer类型的身份。在这里我们选择自定义的密码而不是由服务器自动生成:

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register \
--id.name peer1 \
--id.type peer \
--id.affiliation org1.department1 \
--id.secret peer1pw

注意,部门信息区分大小写,但服务器配置文件中指定的非叶子部门关系始终以小写形式存储。 例如,如果服务器配置文件的部门关系部分如下所示:

affiliations:
BU1:
Department1:
- Team1
BU2:
- Department2
- Department3

BU1,Department1,BU2使用小写进行存储。这是因为Fabric CA使用Viper读取配置。Viper对于大小写不敏感,如果需要注册一个身份部门为Team1,则需要通过--id.affiliation参数这样配置:bu1.department1.Team1

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register \
--id.name client1 \
--id.type client \
--id.affiliation bu1.department1.Team1

登录一个peer身份的用户

之前已经成功注册了一个peer身份的用户,可以通过指定idsecret进行登录,与之前不同的是需要通过-M参数指定Hyperledger Fabric MSP(成员关系服务提供者)文件夹结构。

接下来的命令将会登录peer1,确保使用-M参数指定了peer的MSP文件夹路径,该路径也是peercore.yaml文件内mspConfigPath参数的设置值。或者也可以通过环境变量FABRIC_CA_CLIENT_HOME指定peer的主目录。

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
fabric-ca-client enroll \
-u http://peer1:peer1pw@localhost:7054 \
-M $FABRIC_CA_CLIENT_HOME/msp

登录一个orderer也是相同的,除了MSP文件夹是在ordererorderer.yaml文件中通过参数LocalMSPDir进行设置。

fabric-ca-server颁发的所有注册证书均具有以下组织单位(或简称为“ OU”):

  1. OU层次结构的根等于身份类型。
  2. OU被添加到身份部门关系的每个组成部分。

例如,如果一个身份类型为peer,部门为department.team1,则身份的OU分层(从根部开始):OU=team1,OU=department1,OU=peer.

获取身份混合器证书

...

获取身份混合器证书撤销信息

重新登录一个身份

假如你的登录证书过期了或者被恶意操作,需要通过以下命令重新创建一个登录证书:

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
fabric-ca-client reenroll

撤销一个证书或者身份

身份或者证书是可以被撤销的。撤销一个身份将会撤销所有属于这个身份的证书同时也会阻止该身份去获取新的证书。撤销一个证书只会使单个证书无效。

为了撤销一个证书或者是身份。撤销者必须含有hf.Revokerhf.Registrar.Roles两个属性。撤销一个身份只可以撤销从属于自己下级或者相同级别部门的证书或者是身份。进一步,撤销者只能撤销在撤销者hf.Registrar.Roles属性列表中存在的身份类型的身份。

例如,部门为orgs.org1并且hf.Registrar.Roles=peer,client的撤销者可以撤销从属于orgs.org1部门或者是orgs.org1.department1并且身份类型为peer或者是client的身份。不能撤销从属于orgs.org2部门或者是其他类型的身份。

下面的命令将会使一个身份与该身份下的所有证书失效,该身份未来对fabric CA服务器的所有请求将会被拒绝。

fabric-ca-client revoke -e <enrollment_id> -r <reason>

下面是-r参数支持的具体的原因:

  1. unspecified
  2. keycompromise
  3. cacompromise
  4. affiliationchange
  5. superseded
  6. cessationofoperation
  7. certificatehold
  8. removefromcrl
  9. privilegewithdrawn
  10. aacompromise

例如,引导启动的admin属于部门的最上级可以撤销peer1的身份信息:

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client revoke -e peer1

属于一个身份的登录证书可以通过具体的AKI(权限密钥标识符)和序列号进行撤销:

fabric-ca-client revoke -a xxx -s yyy -r <reason>

例如,可以通过使用openssl命令获取一个证书的AKI和序列号并通过revoke命令撤销证书:

serial=$(openssl x509 -in userecert.pem -serial -noout | cut -d "=" -f 2)
aki=$(openssl x509 -in userecert.pem -text | awk '/keyid/ {gsub(/ *keyid:|:/,"",$1);print tolower($0)}')
fabric-ca-client revoke -s $serial -a $aki -r affiliationchange

--gencrl参数可以用来生成CRL(证书撤销列表),CRL包含所有被撤销的证书。例如,以下命令可以撤销peer1的身份。生成一个CRL并存储到<msp 文件夹>/crls/crl.pem文件。

fabric-ca-client revoke -e peer1 --gencrl

CRL可以使用gencrl命令生成,参考生成CRL部分获取关于gencrl命令的更多信息。

生成CRL(证书撤销列表)

通过Fabric CA SERVER撤销一个证书后,在Hyperledger Fabric中合适的MSP文件需要进行更新。包括本地的peer节点的MSP与合适的通道配置区块中的MSP.为了做到这一点,PEM编码的CRL需要放置到MSP文件夹内的crls文件夹。fabric-ca-client gencrl命令可以生成CRL。任何带有hf.GenCRL属性的身份都可以生成包含所有在一个确定的时间被撤销的证书的序列号的CRL。生成的CRL存储在<msp 文件夹>/crls/crl.pem文件。

以下的命令将会创建包含所有被撤销的(超时和未超时)证书的CRL存储在<msp 文件夹>/crls/crl.pem文件。

export FABRIC_CA_CLIENT_HOME=~/clientconfig
fabric-ca-client gencrl -M ~/msp

...

开启TLS

这一部分描述如何为Fabric CA客户端配置TLS的更多细节。

以下部分可以在fabric-ca-client-config.yaml文件中进行配置:

tls:
enabled: true
certfiles:
- root.pem
client:
certfile: tls_client-cert.pem
keyfile: tls_client-key.pem

certfiles选项设置为被客户端信任的根证书。典型的就是Fabric CA根服务器的证书,ca-cert.pem可以在服务器的主目录发现.

client选项要求只能手动在服务器进行TLS配置。

基于属性的访问控制

...未完待续

Fabric-Ca使用的更多相关文章

  1. Fabric CA环境的集成

    我们前面关于Fabric的所有文章中用到的例子都没有CA Server,都是由cryptogen这个工具根据crypto-config.yaml而生成的.但是在实际生产环境中,我们肯定不能这么做,我们 ...

  2. (转)Fabric CA环境的集成

    PS:因为我部署的是集群(4peer+1order),需要为order,org1,org2分别建立一个CA,拿org1使用举例,获取org1根证书私钥名称:PRIVATE_KEY.sh #!/bin/ ...

  3. Hyperledger Fabric CA的命令行用法

    介绍Hyperledger Fabric CA的命令行方式简单用法 Hyperledger Fabric CA由server和client两部分组成. 设置两个环境变量 export FABRIC_C ...

  4. Hyperledger Fabric CA User’s Guide——配置设置(四)

    配置设置 Fabric CA提供了三种方案去配置Fabric CA服务端和客户端,优先顺序是: CLI flags(标识) 环境变量 配置文件 在本文档的其余部分中,我们将对配置文件进行更改.但是,可 ...

  5. Hyperledger Fabric CA User’s Guide——开始(三)

    Fabric CA User’s Guide——开始 先决条件 安装Go 1.9+ 设置正确的GOPATH环境变量 安装了libtool和libtdhl-dev包 下面是在Ubuntu上安装libto ...

  6. Hyperledger Fabric CA User’s Guide——概述(二)

    概述 下面的图表说明了如何将Hyperledger Fabric CA与总体的Hyperledger Fabric结构相匹配. 有两种方式与一种Hyperledger Fabric CA服务器进行交互 ...

  7. Hyperledger Fabric CA User’s Guide——CA用户指南(一)

    Fabric CA用户指南 Hyperledger Fabric CA是一种用于Hyperledger Fabric的认证机构(CA). 它提供了如下特性: 登记身份(注册ID),或者连接到作为用户注 ...

  8. Fabric CA/数字证书管理

    MSP(Membership Service Provider)成员管理服务提供商 名词: 1.CSR(Cerificate Signing Request):证书签署请求文件 CSR里包含申请者的 ...

  9. Hyperledger:Fabric CA 用户指南 [译]

    Fabric CA 用户指南 Fabric CA 是 Hyperledger Fabric 的官方配套认证设施. 原文链接:http://hyperledger-fabric.readthedocs. ...

  10. Fabric CA的部署与使用

    Fabric CA是Hyperledger Fbric的证书认证中心,提供以下功能:用户信息的登记与注册,数字证书的颁发与管理. 前言 之前使用CA服务一直是在docker容器中运行下载好的CA镜像, ...

随机推荐

  1. Day01-变量/常量/数据类型/流程控制之 if

    1.变量 把程序运行的中间结果临时的存在内存里,以便后续的代码调用.代指一些复杂的.过长的数据. 声明变量  name = 'Dylan' # 把数据'Dylan'声明(赋值)给变量 nmae,以便后 ...

  2. Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览

    ​ ​本文是Spring Cloud专栏的第一篇文章,了解本篇文章内容有助于更好的理解后面文章 ​ 一.网站架构演变过程 1-1.传统架构 传统的SSH架构,分为三层架构 web控制层.业务逻辑层.数 ...

  3. Oracle SCN 详解

    一.简介 scn,system change number 在某个时间点定义数据库已提交版本的时间戳标记,Oracle为每个已提交事务分配一个唯一的scn,scn值是对数据库进行更改的逻辑时间点.sc ...

  4. webpack4分包方案

    webpack4放弃了 commonsChunkPlugin,使用更方便灵活智能的 splitChunks 来做分包的操作. 下面有几个例子,并且我们假设所有的chunks大小至少为30kb(采用sp ...

  5. [TimLinux] JavaScript 面向对象程序设计

    1. 面向对象 面向对象语言有一个标志:都有类的概念.通过类可以创建任意多个具有相同属性和方法的对象.ECMAScript中没有类的概念,因此JavaScript中的对象夜雨基于类的语言中的面向对象有 ...

  6. 2019 ICPC上海网络赛 A 题 Lightning Routing I (动态维护树的直径)

    题目: 给定一棵树, 带边权. 现在有2种操作: 1.修改第i条边的权值. 2.询问u到其他一个任意点的最大距离是多少. 题解: 树的直径可以通过两次 dfs() 的方法求得.换句话说,到任意点最远的 ...

  7. Python入门(一个有趣的画图例子实战)你肯定不会

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:qiu_fang  画一条可爱的python(蟒蛇): import t ...

  8. cl创建opencv程序

    环境 win8 VS2017或VS2013 opencv 3.2.0 配制环境变量 解压opencv到某个目录,比如D:\Program\Uninstall,把设置OPENCV_HOME为D:\Pro ...

  9. 毕业半年,买了一台MacBook Pro

    前言 只有光头才能变强. 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y 毕业半年,给自己买了一台MacBookPro 1 ...

  10. 纯净版SSM

    pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w ...