介绍Hyperledger Fabric CA的命令行方式简单用法

Hyperledger Fabric CA由server和client两部分组成。
设置两个环境变量

export FABRIC_CA_SERVER_HOME=/path_to/fabric-ca/server
export FABRIC_CA_CLIENT_HOME=/path_to/fabric-ca/client

server的操作主要有两个:

1. 初始化Server服务

在server启动之前,需要至少有一个自我认证的身份存在,这个步骤主要会创建这个自我认证的身份。

${FABRIC_CA_SERVER_HOME}/fabric-ca-server init -b admin:adminpw
2017/10/09 13:44:47 [INFO] Created default configuration file at /path_to/fabric-ca/server/fabric-ca-server-config.yaml
2017/10/09 13:44:47 [INFO] generating key: &{A:ecdsa S:256}
2017/10/09 13:44:47 [INFO] encoded CSR
2017/10/09 13:44:47 [INFO] signed certificate with serial number 140063197993174970535175712880510082344059841460
2017/10/09 13:44:47 [INFO] The CA key and certificate were generated for CA
2017/10/09 13:44:47 [INFO] The key was stored by BCCSP provider 'SW'
2017/10/09 13:44:47 [INFO] The certificate is at: /path_to/fabric-ca/server/ca-cert.pem
2017/10/09 13:44:47 [INFO] Initialized sqlite3 database at /path_to/fabric-ca/server/fabric-ca-server.db
2017/10/09 13:44:47 [INFO] Home directory for default CA: /path_to/fabric-ca/server
2017/10/09 13:44:47 [INFO] Initialization was successful

命令执行完成后生成如下4个文件:

  1. server配置文件
    ${FABRIC_CA_SERVER_HOME}/fabric-ca-server-config.yaml
  2. server内部存储数据库文件
    ${FABRIC_CA_SERVER_HOME}/fabric-ca-server.db
  3. 自我认证身份的证书文件
    ${FABRIC_CA_SERVER_HOME}/ca-cert.pem
  4. 自我认证身份的私钥(private key)文件${FABRIC_CA_SERVER_HOME}/msp/keystore/27554ec70fe8a2707c0a74ba5d6ecb36a0a4d565871c4f050ed93d662849560d_sk

其中${FABRIC_CA_SERVER_HOME}/fabric-ca-server.db是一个sqlite文件,包含三个表:

1. table affiliations
name VARCHAR(64) | prekey VARCHAR(64)
------------------+--------------------+
org1 | |
org1.department1 |org1 |
org1.department2 |org1 |
org2 | |
org2.department1 |org2 |
------------------+--------------------+
2. table certificates
<no date>
3. table users
id VARCHAR(64) | token bytea | type VARCHAR(64) | affiliation VARCHAR(64) | attributes VARCHAR(256) | state INTEGER | max_enrollments INTEGER |
----------------+-------------------------------------------------------------+------------------+-------------------------+--------------------------+---------------+---------------------------+
admin |$2a$10$9AVqV7I8tGvA0GPUbAuTluzTEiJwb1F1MHw2OjywGPqTeIH/5pvH6 |client | | <see bellow> | 0 | -1 |
----------------+-------------------------------------------------------------+------------------+-------------------------+--------------------------+---------------+---------------------------+ attributes=[{"name":"hf.Registrar.DelegateRoles","value":"client,user,validator,auditor"},{"name":"hf.Revoker","value":"1"},{"name":"hf.IntermediateCA","value":"1"},{"name":"hf.Registrar.Roles","value":"client,user,peer,validator,auditor"}]

2. 启动Server服务

初始化完成之后就可以启动server。

${FABRIC_CA_SERVER_HOME}/fabric-ca-server start -b admin:adminpw
2017/10/09 12:17:04 [INFO] Configuration file location: /path_to/fabric-ca/fabric-ca-server-config.yaml
2017/10/09 12:17:04 [INFO] Starting server in home directory: /path_to/fabric-ca
2017/10/09 12:17:04 [INFO] The CA key and certificate already exist
2017/10/09 12:17:04 [INFO] The key is stored by BCCSP provider 'SW'
2017/10/09 12:17:04 [INFO] The certificate is at: /path_to/fabric-ca/ca-cert.pem
2017/10/09 12:17:04 [INFO] Initialized sqlite3 database at /path_to/fabric-ca/fabric-ca-server.db
2017/10/09 12:17:04 [INFO] Home directory for default CA: /path_to/fabric-ca
2017/10/09 12:17:04 [INFO] Listening on %!s(int=7054)%!(EXTRA string=http://0.0.0.0:7054)

这里,启动过程使用默认的配置文件,即在初始化阶段生成的${FABRIC_CA_SERVER_HOME}/fabric-ca-server-config.yaml,如果需要使用非默认配置文件,只需要通过命令行参数--config指定文件名即可。

另,我们看到server端的主要操作有两步完成,第一步初始化,第二步启动;实际上两步可以合并成一步,即直接执行第二步启动就可以,因为在启动过程中如果发现还没有进行过初始化,那么会自动执行初始化的操作;那为什么需要分成两步呢,因为初始化完成之后用户可能需要对配置文件进行修改,调整参数和配置,然后在启动,而如果直接执行第二步就没有机会修改和调整配置了。

启动完之后可以发送如下命令检查时候工作正常

$ curl -i -uadmin:adminpw -X POST -H "Content-type:application/json" http://localhost:7054/cainfo
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 10 Oct 2017 05:42:16 GMT
Content-Length: 1127 {
"success":true,
"result":{
"CAName":"",
"CAChain":"LS0tLS1CRUdJT......tLS0K"
},
"errors":[],
"messages":[]
}

下面三步是客户端的操作

3. 完成自证管理员身份认证

自证管理员是在server启动的时候就内置进去的;后面的很多操作都需要管理员的身份,所以这一步先要获取管理员的身份资格,才能往下操作,比如添加新的角色身份,添加新的管理员等等。

${FABRIC_CA_CLIENT_HOME}/fabric-ca-client enroll -u http://admin:adminpw@localhost:7054
2017/10/09 15:58:40 [INFO] User provided config file: /path_to/fabric-ca/client/fabric-ca-client-config.yaml
2017/10/09 15:58:40 [INFO] Created a default configuration file at /path+_to/fabric-ca/client/fabric-ca-client-config.yaml
2017/10/09 15:58:40 [INFO] generating key: &{A:ecdsa S:256}
2017/10/09 15:58:40 [INFO] encoded CSR
2017/10/09 15:58:40 [INFO] Stored client certificate at /path_to/fabric-ca/client/msp/signcerts/cert.pem
2017/10/09 15:58:40 [INFO] Stored CA root certificate at /path_to/fabric-ca/client/msp/cacerts/localhost-7054.pem

端口7054是server的默认端口,可以在server配置文件里${FABRIC_CA_SERVER_HOME}/fabric-ca-server-config.yaml进行修改。

命令执行完之后生成如下4个文件:

  1. client配置文件
    ${FABRIC_CA_CLIENT_HOME}/fabric-ca-client-config.yaml
  2. CA根证书文件
    ${FABRIC_CA_CLIENT_HOME}/msp/cacerts/localhost-7054.pem
    这个文件其实就是server端的自我认证身份的证书文件,即${FABRIC_CA_SERVER_HOME}/ca-cert.pem一致
  3. client证书文件
    ${FABRIC_CA_CLIENT_HOME}/msp/signcerts/cert.pem
  4. client私钥(private key)文件
    ${FABRIC_CA_CLIENT_HOME}/msp/keystore/338dc8051e6aa74bcbc1ee7da17afb735e0d8c1291f0a6b6d98bfce605a774ba_sk

再看server端数据库的变化,可以看到表certificates里面多了一条记录:

1. certificates

id VARCHAR(64) | serial_number blob                      | authority_key_identifier blob            | ca_label blob | status blob | reason int | expiry timestamp          | revoked_at timestamp      | pem blob |
---------------+-----------------------------------------+------------------------------------------+---------------+------------------------------------------------------+---------------------------+----------+
admin | 5b5c9e1859b1798088cf096c7f249301512fdc8 | bf588926fdff01c07124099d0455846fae32ecde | | good | 0 | 2018-10-09 07:54:00+00:00 | 0001-01-01 00:00:00+00:00 | <bellow> |
---------------+-----------------------------------------+------------------------------------------+---------------+------------------------------------------------------+---------------------------+----------+ pem blob=
-----BEGIN CERTIFICATE-----
MIICVjCCAfygAwIBAgIUBbXJ4YWbF5gIjPCWx/JJMBUS/cgwCgYIKoZIzj0EAwIw
aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK
...
A0gAMEUCIQDVO1GO+9k+g7hbuevLh/YRq9LQNptu6IaJOAzLuPdCeQIgcMvfoKuv
Y+W2JC70/xbL4yimpt86k55CA/aqyrmq5+0=
-----END CERTIFICATE-----
实际上这个pem的内容就是client的证书文件,即${FABRIC_CA_CLIENT_HOME}/msp/signcerts/cert.pem一致。

4. 登记普通角色身份(register)

如下示例,我们使用 admin 的身份及其配套证书,登记了一个名称为 "tester"、类型为 "user"、组织关系为 "org1.department1"、"hf.Revoker" 属性为 "true" 的新角色:

${FABRIC_CA_CLIENT_HOME}/fabric-ca-client register --id.name tester   --id.secret testpasswd --id.type user --id.affiliation org1.department1 --id.attrs hf.Revoker=true
or
${FABRIC_CA_CLIENT_HOME}/fabric-ca-client register --id.name tester02 --id.secret testpasswd --id.type user --id.affiliation org1.department2 --id.attrs 'hf.Revoker=true,admin=true:ecert'

这地方需要注意的是:

  • --id.type参数必须是是server端配置文件fabric-ca-server-config.yaml里hf.Registrar.Roles属性值里的一个。
  • --id.affiliation参数表示被注册对象的从属关系参数一定要归属于预先配置的组织属性。换句话说,被注册对象的affiliation参数一定要是预先配置的affiliation参数的一个前缀。例如,假设预先配置的组织关系为:“a.b.c”,那么新注册的对象的affiliation属性可以是“a.b.c”,也可以是“a.b”,但“a.c”就不能通过注册。

再看server端数据库的变化,可以看到表users里面多了一条记录。

1. table users
id VARCHAR(64) | token bytea | type VARCHAR(64) | affiliation VARCHAR(64) | attributes VARCHAR(256) | state INTEGER | max_enrollments INTEGER |
----------------+--------------------------------------------------------------+------------------+-------------------------+--------------------------+---------------+---------------------------+
admin | $2a$10$9AVqV7I8tGvA0GPUbAuTluzTEiJwb1F1MHw2OjywGPqTeIH/5pvH6 | client | | <see bellow> | 0 | -1 |
tester | $2a$10$kOuCBi8IHk8tAUD9afNtLOYBmiYcse4rLdURILoumuJCI69FVDm2O | user | org1.department1 | <see bellow> | 0 | -1 |
----------------+--------------------------------------------------------------+------------------+-------------------------+--------------------------+---------------+---------------------------+
attributes=[{"name":"hf.Registrar.DelegateRoles","value":"client,user,validator,auditor"},{"name":"hf.Revoker","value":"1"},{"name":"hf.IntermediateCA","value":"1"},{"name":"hf.Registrar.Roles","value":"client,user,peer,validator,auditor"}]
attributes=[{"name":"hf.Revoker","value":"true"}]

5. 认证普通角色身份(enroll)

完成身份登记之后需要做认证。

${FABRIC_CA_CLIENT_HOME}/fabric-ca-client enroll -u http://tester:testpasswd@localhost:7054
or
${FABRIC_CA_CLIENT_HOME}/fabric-ca-client enroll -u http://tester02:testpasswd@localhost:7054 2017/10/09 13:34:52 [INFO] User provided config file: /path_to/fabric-ca-client/fabric-ca-client-config.yaml
2017/10/09 13:34:52 [INFO] generating key: &{A:ecdsa S:256}
2017/10/09 13:34:52 [INFO] encoded CSR
2017/10/09 13:34:52 [INFO] Stored client certificate at /path_to/fabric-ca-client/msp/signcerts/cert.pem
2017/10/09 13:34:52 [INFO] Stored CA root certificate at /path_to/fabric-ca-client/msp/cacerts/localhost-7054.pem

完成角色认证后,再看server端数据库的变化,和自证管理员身份认证一样,会往certificates表里面插入一条数据,其内容是对应角色的证书信息。

6. 总结登记(register)和认证(enroll)的功能

总结起来,登记身份和认证身份分别完成的功能是:

  1. 登记身份用来登记一个身份
    它需要提供待登记身份的身份信息,包含用户名,密码,类型,组织关系,等属性。
    实施登记的人,还需要有登记的权限,例如初始的自证管理员,或其他管理员身份。
    登记过程不会生成本地文件,但是会往server的数据库表users中插入一条数据。
  2. 认证身份用来认证一个前面已经登记过的身份
    它需要提供登记时身份的名字和密码;实施认证不需要认证的权利。
    认证过程会生成本地文件,包括client配置文件,client证书文件,client私钥文件,和根证书文件。
    同时在server端会把client的证书写入数据库表certificates中。

这也就是client三个步骤里面,第一步就需要做自证管理员身份的认证操作,因为此时客户端没有任何证书身份信息,只有自证管理员的名字和密码,可以完成自证管理员的认证操作;完成后本地就有自证管理员的身份信息包括证书文件,私钥;有了这些信息,才可以操作接下来的登记其他身份操作,因为登记一个身份需要具有登记权限的人才能做,既然刚才已经完成了自证管理员的认证操作,那么本地身份就是自证管理员,因此可以以自证管理员身份进行其他的登记操作。

另外要注意的是,在认证身份的时候会把之前已经存在的所有配置文件(包括client配置文件,client证书文件,client私钥文件,根证书文件)都重新写掉,文档上说可以通过命令行指定不同的文件名,但是经过试验好像不灵,不知道这是我使用上的问题,还是程序bug。所以在我们例子中当完成用户tester的认证之后,本地的证书信息就被覆盖成tester的了,此时再进行用户登记操作就会失败,因为本地用户已经是tester了,而不是最初的自证管理员了,而tester用户不具有登记用户的权限。办法就是重新认证自证管理员身份。

作者:CodeGeek
链接:https://www.jianshu.com/p/2159f9043102
來源:简书

转自:https://www.jianshu.com/p/2159f9043102

Hyperledger Fabric CA的命令行用法的更多相关文章

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

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

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

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

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

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

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

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

  5. HyperLedger Fabric ChainCode开发——shim.ChaincodeStubInterface用法

    深蓝前几篇博客讲了Fabric的环境搭建,在环境搭建好后,我们就可以进行Fabric的开发工作了.Fabric的开发主要分成2部分,ChainCode链上代码开发和基于SDK的Application开 ...

  6. php命令行用法简介

    Php是一个非常流行的web服务端脚本语言.其实,php不仅仅可以在web服务器中充当重要角色.在命令行一样可以执行. 本文中,笔者为各位介绍下php在命令行中的使用方法. 1.  查看php的版本. ...

  7. adb logcat 命令行用法

    作者 :万境绝尘  转载请著名出处 eclipse 自带的 LogCat 工具太垃圾了, 开始用 adb logcat 在终端查看日志; 1. 解析 adb logcat 的帮助信息 在命令行中输入  ...

  8. 进一步学习 nox 教程,轻松掌握命令行用法

    英文 |Command-line usage 出处 | nox 官方文档 译者 | 豌豆花下猫@Python猫 Github地址:https://github.com/chinesehuazhou/n ...

  9. HyperLedger Fabric ca 1.2 正式环境部署

    生成一个根CA(RootCA),在根CA下3个中间CA(IntermediaCA). 1. 运行和配置RootCA服务#cd /opt/gopath/src/github.com/hyperledge ...

随机推荐

  1. linux命令学习(6):ps命令

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信 ...

  2. day_10 py 字典

    #!/usr/bin/env/python#-*-coding:utf-8-*-'''字典: (就是增加个索引名字,然后归类了一下) infor = {键:值,键:值} 列表存储相同的信息随着列表里面 ...

  3. php中memcached的使用

    文档所在:http://php.net/manual/zh/book.memcached.php 1.在php使用memcached操作之前要实例化memcached: [系统类]  2.添加服务器: ...

  4. 文件二进制与String相互转换

    //转换base64 OpenFileDialog dialog = new OpenFileDialog(); //dialog.Filter = "所有文件(*.*)|*.*" ...

  5. linux shutdown命令以及参数详解

    在说shutdown命令之前 先说一下sync命令: sync:将内存中尚未写入硬盘的数据写入硬盘 因为linux为了保证数据读写速度,把常用的数据放在内存中,不会立即写入硬盘,如果有不当关机,这些数 ...

  6. 20165311学习基础和C语言基础调查

    一.技能学习经验 有什么技能比90%的人更好? 这个问题问的就很emmmm..我觉得自己的推理和逻辑思维能力比较出众,面对新事物的自学速度比较快. 针对技能谈一下成功的经验. 每一项出众的技能都是与平 ...

  7. 存储json数据的编码问题

    在使用json.dumps时要注意一个问题   >>> import json >>> print json.dumps('中国') "\u4e2d\u5 ...

  8. php新加扩展模块

    记录下在已经编译安装的PHP上面增加扩展模块,下面以安装mbstring.so为例 1.进入PHP源码文件中的mbstring文件夹,一般都是在ext目录 cd php-5.5.29/ext/mbst ...

  9. 写一个表达式检查所给的整数是否它第三个数字(从右向左)是7。示例:1732 -> true。

    在学习C#基础部分(课件来源:http://www.xuepub.com/52.html),遇到这么一个题目,前段时间面试遇到一个"车牌限行的问题",我就在想如何取末尾数值的问题. ...

  10. Ubuntu16.04开机蓝屏问题解决

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...