Fabric-Ca使用
Fabric—Ca的概念不再解释了,这里只说明使用方法:
前置条件
- Go语言1.10+版本
- GOPATH环境变量正确设置
- 已安装
libtool和libtdhl-dev包
Ubuntu系统
通过以下命令安装libtool和libtdhl-dev包:
sudo apt install libtool libltdl-dev
MacOs 系统
Mac系统通过以下命令安装:
brew install libtool
Fabric-Ca安装
可以通过以下两种途径进行安装:
- 直接下载二进制文件:
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服务器的主文件夹,优先级由高到低排序:
- 通过命令行设置参数
--home设置。 - 如果设置了
FABRIC_CA_SERVER_HOME环境变量,则使用该环境变量作为主文件夹。 - 如果设置了
FABRIC_CA_HOME环境变量,则使用该环境变量作为主文件夹。 - 如果设置了
CA_CFG_PATH环境变量,则使用该环境变量作为主文件夹。 - 如果以上方法都没有设置,则将当前工作目录作为主文件夹。
官方建议是通过设置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客户端的主文件夹,优先级由高到低排序:
- 通过命令行设置参数
--home设置。 - 如果设置了
FABRIC_CA_CLIENT_HOME环境变量,则使用该环境变量作为主文件夹。 - 如果设置了
FABRIC_CA_HOME环境变量,则使用该环境变量作为主文件夹。 - 如果设置了
CA_CFG_PATH环境变量,则使用该环境变量作为主文件夹。 - 如果以上方法都没有设置,则
$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服务器进行三个部分的权限检查确定当前用户是否具有权限进行身份的注册。
- 注册者必须含有
hf.Registrar.Roles属性,并且需要注册的身份类型必须在该属性对应的值的列表中存在。比如注册者的hf.Registrar.Roles属性中对应的值只有一个peer,那么注册者使能注册类型为peer的身份,而不能注册client,admin,orderer.如果注册者的hf.Registrar.Roles属性对应的值为*,则说明可以注册任何类型的身份。 - 简单说就是上下级关系,比如注册者所处的部门为
a.b,那么他只能注册处于a.b以及a.b.*部门的身份,而不能注册处于a.c部门的身份。如果需要注册一个最上级的部门的身份,那么需要将需要将需要注册的身份的hf.affiliation指定为.,并且注册者所处的部门也需要是最上级的部门。如果在注册身份时没有指定所属的部门,则默认被注册的身份所处的部门与注册者部门相同。 - 如果注册者满足以下条件则可以注册带有属性的身份:
- 对于
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 id为admin2- 部门为
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 id为admin3- 身份类型为
client - 部门为
org1.department1 - 属性名字为
hf.Revoker,对应的值为true - 属性名字为
anotherAttrName,对应的值为anotherAttrValue
设置maxenrollments为0或者是不设置将导致该身份可以使用CA的最大enrollment次数。并且一个身份的maxenrollments不能超过CA的enrollments最大值。例如,如果CA的enrollment最大值为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身份的用户,可以通过指定id和secret进行登录,与之前不同的是需要通过-M参数指定Hyperledger Fabric MSP(成员关系服务提供者)文件夹结构。
接下来的命令将会登录peer1,确保使用-M参数指定了peer的MSP文件夹路径,该路径也是peer的core.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文件夹是在orderer的orderer.yaml文件中通过参数LocalMSPDir进行设置。
由fabric-ca-server颁发的所有注册证书均具有以下组织单位(或简称为“ OU”):
- OU层次结构的根等于身份类型。
- 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.Revoker和hf.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参数支持的具体的原因:
- unspecified
- keycompromise
- cacompromise
- affiliationchange
- superseded
- cessationofoperation
- certificatehold
- removefromcrl
- privilegewithdrawn
- 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使用的更多相关文章
- Fabric CA环境的集成
我们前面关于Fabric的所有文章中用到的例子都没有CA Server,都是由cryptogen这个工具根据crypto-config.yaml而生成的.但是在实际生产环境中,我们肯定不能这么做,我们 ...
- (转)Fabric CA环境的集成
PS:因为我部署的是集群(4peer+1order),需要为order,org1,org2分别建立一个CA,拿org1使用举例,获取org1根证书私钥名称:PRIVATE_KEY.sh #!/bin/ ...
- Hyperledger Fabric CA的命令行用法
介绍Hyperledger Fabric CA的命令行方式简单用法 Hyperledger Fabric CA由server和client两部分组成. 设置两个环境变量 export FABRIC_C ...
- Hyperledger Fabric CA User’s Guide——配置设置(四)
配置设置 Fabric CA提供了三种方案去配置Fabric CA服务端和客户端,优先顺序是: CLI flags(标识) 环境变量 配置文件 在本文档的其余部分中,我们将对配置文件进行更改.但是,可 ...
- Hyperledger Fabric CA User’s Guide——开始(三)
Fabric CA User’s Guide——开始 先决条件 安装Go 1.9+ 设置正确的GOPATH环境变量 安装了libtool和libtdhl-dev包 下面是在Ubuntu上安装libto ...
- Hyperledger Fabric CA User’s Guide——概述(二)
概述 下面的图表说明了如何将Hyperledger Fabric CA与总体的Hyperledger Fabric结构相匹配. 有两种方式与一种Hyperledger Fabric CA服务器进行交互 ...
- Hyperledger Fabric CA User’s Guide——CA用户指南(一)
Fabric CA用户指南 Hyperledger Fabric CA是一种用于Hyperledger Fabric的认证机构(CA). 它提供了如下特性: 登记身份(注册ID),或者连接到作为用户注 ...
- Fabric CA/数字证书管理
MSP(Membership Service Provider)成员管理服务提供商 名词: 1.CSR(Cerificate Signing Request):证书签署请求文件 CSR里包含申请者的 ...
- Hyperledger:Fabric CA 用户指南 [译]
Fabric CA 用户指南 Fabric CA 是 Hyperledger Fabric 的官方配套认证设施. 原文链接:http://hyperledger-fabric.readthedocs. ...
- Fabric CA的部署与使用
Fabric CA是Hyperledger Fbric的证书认证中心,提供以下功能:用户信息的登记与注册,数字证书的颁发与管理. 前言 之前使用CA服务一直是在docker容器中运行下载好的CA镜像, ...
随机推荐
- 负载均衡集群介绍、LVS介绍、LVS调度算法、LVS NAT模式搭建
7月4日任务 18.6 负载均衡集群介绍18.7 LVS介绍18.8 LVS调度算法18.9/18.10 LVS NAT模式搭建 扩展lvs 三种模式详解 http://www.it165.net/a ...
- C语言l-2019秋作业01
2.1 你对软件工程专业或者计算机科学与技术专业了解是怎样? 在进入大学之前,我认为软件工程就是学习开发软件的,后来,从网上搜索了有关它的定义,软件工程是一门研究用工程化方法构建和维护软件的学科,它以 ...
- PHP fsockopen受服务器KeepAlive影响的解决
在开发过程中常常遇到这样的需求,模拟浏览器访问某接口,并获取返回数据.我们比较常使用的方法是fsockopen与接口建立连接,然后发出指令,然后通过fgets接受返回值. 但是我们发现,通过PHP模拟 ...
- 关于c++函数里面return的用法,关于调用的讲解
与下面的图片对比一下 可以看见在int b = test();d的时候cout<<"hello";就被调用了: cout<<b;只是返回return a的值 ...
- node.js入门安装过程
本次随笔的目的是教大家如何安装 node.js安装 第一步:安装node环境 下载地址:https://nodejs.org/en/download/ 下载好后 对应一下你的node版本 ,傻瓜式安装 ...
- Scrapy+eChart自动爬取生成网络安全词云
因为工作的原因,近期笔者开始持续关注一些安全咨询网站,一来是多了解业界安全咨询提升自身安全知识,二来也是需要从各类安全网站上收集漏洞情报. 作为安全情报领域的新手,面对大量的安全咨询,多少还是会感觉无 ...
- Magicodes.Sms短信库的封装和集成
简介 Magicodes.Sms是心莱团队封装的短信服务库,已提供Abp模块的封装. Nuget 新的包 名称 说明 Nuget Magicodes.Sms.Aliyun 阿里云短信库 Magicod ...
- jQuery操作页面的元素
主要有添加,替换,删除,清空三种方式: 添加又分为,在之前添加,在之后添加,在元素外之前添加,在元素外之后添加.每个添加方式又有俩种方法(效果一模一样): 俩种方法区添加,在原内容之后: p.appe ...
- Python基础第二课
字符串(引号):四种表达方式 n1 = "我是" n1 = '我是' n1 = """我是""" n1 = '" ...
- jmeter微信公众号接口测试实例
线程组 HTTP Cookie 管理器 HTTP 请求默认值 用户定义的变量 察看结果树 HTTP请求 响应断言 正则表达式提取器 线程组 HTTP Cookie 管理器 HTTP 请求默认值 用户定 ...