介绍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. iOS - 开发中加载本地word/pdf文档说明

    最近项目中要加载一个本地的word/pdf等文件比如<用户隐私政策><用户注册说明>,有两种方法加载 > 用QLPreviewController控制器实现 步骤 : & ...

  2. mtd工具

    http://daemons.net/linux/storage/mtd.html MTD The Memory Technology Devices (MTD) subsystem provides ...

  3. nginx启用TCP反向代理日志配置

    Nginx使用TCP反向代理日志配置不同于http 修改nginx配置文档/usr/local/nginx/conf/nginx.conf 设置日志格式 stream { log_format pro ...

  4. 标准库 os、sys、logging、configparser、time、requests

    os : 与操作系统交互的模块 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于 ...

  5. hdu2243 考研路茫茫——单词情结【AC自动机】【矩阵快速幂】

    考研路茫茫——单词情结 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  6. 【紫书】Ordering Tasks UVA - 10305 拓扑排序:dfs到底再输出。

    题意:给你一些任务1~n,给你m个数对(u,v)代表做完u才能做v 让你给出一个做完这些任务的合理顺序. 题解:拓扑排序版题 dfs到底再压入栈. #define _CRT_SECURE_NO_WAR ...

  7. Linux下无法清空回收站

    清空回收站发生错误,直接使用命令 sudo rm -rf ~/.local/share/Trash/files/* 搞定

  8. SQL复制数据表 (select * into 与 insert into)

    select * into 目标表名 from 源表名 insert into 目标表名(fld1, fld2) select fld1, 5 from 源表名 以上两句都是将 源表 的数据插入到 目 ...

  9. iOS程序main函数之前发生了什么

    我是前言 一个iOS app的main()函数位于main.m中,这是我们熟知的程序入口.但对objc了解更多之后发现,程序在进入我们的main函数前已经执行了很多代码,比如熟知的+ load方法等. ...

  10. [redhat][centos] 让不同小版本的CentOS7使用相同的内核版本

    背景: CentOS7有定期的小版本发布,即官网释出的ISO,是带着小版本号的.CentOS7可以使用平滑升级,从这些小版本号中升上去. 但是并不是每一次的更新,都在释出的ISO中,这样的话,一台既有 ...