学习记录:fabric-ca(1)-user guide

前情提要

起因

区块链在ubuntu上玩比较好,但是onenote就用不了啦(还是HTML方便)。。。干脆把学习记录写成博文,这样也方便其他后来者参考。
学习区块链,上学期折腾半天ripple,终于来到了fabric。现在聚焦于这一个平台,论文也只看fabric相关或者考虑在fabric实现。不然太散根本review不过来。
这不看着fabric的搭建,看到了fabric-ca,这是搭建fabric的第一步。之前的学习记录,以后有空再补上来。

说明

学习fabric-ca主要看官网教程(参考统一放最后)。官网共3部分:User guide,operations guide,deployment guide。3部分循序渐进。
本次是user guide,介绍的是基本用法。fabric的搭建,建议用fabric-ca作为证书节点,所以先要搞清楚这个东西。
所使用fabric-ca版本为1.4.9。
本记录不提供完全的翻译,只是自己的学习心得。

大纲

(目录没用,请用侧边栏自带的目录)

  1. 介绍
  2. 前置,安装,命令行
  3. 配置
  4. 服务器server
  5. 客户端client
  6. HSM
  7. 文件格式
  8. 问题

介绍

这东西提供3个功能:

  1. 身份注册,或连接到LDAP作为用户注册功能
  2. 颁发(enroll)证书(ECerts)
  3. 证书更新,吊销

fabric中说建议用这个,除了证书,这东西还能管理MSP(用户身份服务提供器),所以比较方便。
官网的图一开始没理解,是这样3点:

  1. 首先通过CA服务器构成一个层层的证书信任链(只有一个根CA服务器)
  2. 客户端、SDK可以调用这个服务器来获得CA服务
  3. CA服务器也可以不做什么,只做中转,去找一个LDAP来提供服务

前置,安装,命令行

按章操作即可,go语言环境,下面这个包

sudo apt install libtool libltdl-dev

我这里用了docker启动,不下载bin文件了,所以直接拉取镜像(容器还是好啊,折腾了本地运行结果glibc版本不对,还把系统搞死了两次,幸好有启动盘恢复)
https://hub.docker.com/r/hyperledger/fabric-ca/tags/

VSCode创建docker项目testca,创建testca/docker-compose.yml文件,写:

fabric-ca-server: #  这些设置在容器里都可以查到
	image: hyperledger/fabric-ca:amd64-1.4.9  # 容器来源(理解为类)
	container_name: fabric-ca-server # 容器名称(理解为实例)
	ports:
	  - "7054:7054" # 端口,这里是容器的设置,不是服务的设置哦 前面本机,后面容器
	environment:
	  - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server  # 容器环境变量设置
	volumes:
	  - "./fabric-ca-server:/etc/hyperledger/fabric-ca-server"  # 容器存储设置,前面本机,后面容器
	  - "./scripts:/etc/scripts"  # 自己多弄上去一个东西
	command: bash /etc/scripts/init.sh # 创建之后要执行的命令

这里的命令我弄了一个文件,执行sh,这样初始化就可以多条命令操作,方便点(不懂去查docker-compose)

直接VSCode的命令行运行这个,自己会去找yml文件

$ docker-compose up -d

构建自己的镜像跳过,现在不考虑(开发才考虑,现在是应用)

命令行说的是fabric-ca-server和fabric-ca-client这两个命令,有些共性的东西在这里说了:

  1. 参数都是无比的多,覆盖顺序:命令行>容器的环境变量>配置文件
  2. 客户端和服务器的很多配置都有前缀,区别就是FABRIC_CA_CLIENT和FABRIC_CA_SERVER,也就是服务器和客户端可能有相同名字的配置,换个前缀就OK。
  3. 配置文件支持相对路径,指向配置文件所在目录
    学习记录:fabric-ca(1)-user guide_第1张图片

运行产生了一个文件夹,映射到容器内,这里面都是ca服务器的内容。这个文件夹里的东西就是容器内的,改动会影响容器内,在容器内用ls查看也是一样结构。

服务器server

初始化,如果按照上面操作,产生一个文件夹,fabric-ca-server,里面一大堆东西,都是服务器配置相关,最重要的是一个fabric-ca-server-config.yaml文件,这就是默认的服务器配置文件了,等下改这个。

home的路径决定:

  1. 命令行 -home
  2. FABRIC_CA_SERVER_HOME环境变量
  3. FABRIC_CA_HOME环境变量
  4. CA_CFG_PATH环境变量
  5. 当前工作路径

接下来教程假定设置FABRIC_CA_HOME为$HOME/fabric-ca/server(好坑,前面给的yml明明不是,上面那个FABRIC_CA_HOME是默认路径)

这一句是用来初始化的

fabric-ca-server init -b admin:adminpw

这个-b必须要,代表是管理员启动。fabric要求每个节点必须有至少一个admin。

启动的时候,会有一段CSR,都属于X.509的范围

#  此处控制根CA证书的创建(自签名)
#  根CA证书的到期时间由ca.expiry配置,默认是131400h,就是15年。
#  pathlength用来限制CA证书层次结构,在RFC5280的4.2.1.9节中有说明

# cn是公共名称,O是组织名称,OU是组织单元,L是位置或城市,ST是州,C是国家
# 可以自定义,ca.certfile,ca.keyfile,这会在命令启动的时候调用
# 如果指定-u参数,则使用母CA进行签名,这个就成为一个中间CA服务器
# keyrequest是生成算法和长度,这里代表prime256v1曲线和ecdsa-with-SHA256签名算法
csr:
   cn: fabric-ca-server
   keyrequest:
     algo: ecdsa
     size: 256
   names:
      - C: US
        ST: "North Carolina"
        L:
        O: Hyperledger
        OU: Fabric
   hosts:
     - 0133e06ccd8f
     - localhost
   ca:
      expiry: 131400h
      pathlength: 1

要用自己的证书,则需要把对应文件放到ca.certfile和ca.keyfile指定的位置
ECDSA算法还有其他

size ASN1 OID Signature Algorithm
256 prime256v1 ecdsa-with-SHA256
384 secp384r1 ecdsa-with-SHA384
521 secp521r1 ecdsa-with-SHA512

启动过程中会产生ca-cert.pem 和 ca-key.pem,同时创建默认配置文件(不存在时)

下面都是对配置文件的各种配置,
如果需要https,设置tls.enabled为true。实际使用请一定打开
服务器默认监听端口是7054,这是服务的端口,不是容器的。
‎registry.maxenrollments设置同一密码注册最高次数上限,默认-1,代表不限制
默认数据库为SQLite,也可以连接PostgreSQL or MySQL(先不弄了,还有数据库端SSL配置,挺麻烦)
LDAP也可以配置(但是不懂,先跳过)
CA服务器集群也能设置(给的例子是Haproxy)
也可以整多个CA服务器

证书链的构成,为一个中间CA注册。中间CA在启动时候不光需要-b,还需要-u指定一些东西

fabric-ca-server start -b admin:adminpw -u http://<enrollmentID>:<secret>@<parentserver>:<parentport>

其他配置在配置文件里也有。

还能升级,先升级server,再升级client。升级前备份SQLite3数据库fabric-ca-server.db(默认名称是这个)
官方教程上有升级步骤。
集群也能升级。

注意,其他有一些链接,没有列在目录里。所以如果遇到文中链接,请点一下。

fabric-ca-server共有3个子命令:init,start,version。
其实就是启动,init之后还得启动,start会自动init。
flag超多,分为:b boot选项;n ca选项,H home路径相关;u 中间或LDAP相关;p 端口相关
学习记录:fabric-ca(1)-user guide_第2张图片这个慢慢了解吧,先看懂配置文件才是重点。

客户端client

home的路径决定:

  1. 命令行 -home
  2. FABRIC_CA_CLIENT_HOME环境变量
  3. FABRIC_CA_HOME环境变量
  4. CA_CFG_PATH环境变量
  5. $HOME/.fabric-ca-client(就这里和服务器不一样)

这里遇到个尴尬的事情,那个docker镜像是带了server和client的,那么,这里好像得分开弄一下客户端和服务器,重新来一波。
删掉fabric-ca-server文件夹,修改docke-compose.yml

fabric-ca-server: #  这些设置在容器里都可以查到
    image: hyperledger/fabric-ca:amd64-1.4.9  # 容器来源(类)
    container_name: fabric-ca-server # 容器名称(实例)
    ports:
      - "7054:7054" # 端口 前面是本机,后面是容器
    environment:
      - FABRIC_CA_SERVER_HOME=/etc/hyperledger/fabric-ca-server  # 容器环境变量设置
      - FABRIC_CA_CLIENT_HOME=/etc/hyperledger/fabric-ca-client  # 弄一个客户端,看看生成的文件
    volumes:
      - "./fabric-ca-server:/etc/hyperledger/fabric-ca-server"  # 容器存储设置,前面本机,后面容器
      - "./fabric-ca-client:/etc/hyperledger/fabric-ca-client"  # 
      - "./scripts:/etc/scripts"  # 容器存储设置,前面本机,后面容器
    command: bash /etc/scripts/init.sh # 创建之后要执行的命令

但是生成的fabric-ca-client文件夹是空的。。。看来还是得执行fabric-ca-client命令行才行

csr部分设置看起来一样,cn名字变成了要注册的ID。csr.hosts部分,server是localhost,还有容器ID(也可能实例ID,通过命令行进容器发现是root@5aeefae667e7:/#),客户端感觉应该只写server的就行吧?

在容器里运行,注册到一个客户端,这样fabric-ca-client文件夹就有东西了(其实最好是server和client各一个容器,因为镜像里两个命令都带,所以可以这么玩)

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin  # 不用这行了,前面容器指定了
fabric-ca-client enroll -u http://admin:adminpw@localhost:7054 # 这里的admin是要注册的client的ID,enrollmentID,冒号后是密码

现在我们就有了证书(也有了admin角色),之后就可以通过msp目录中的证书,访问fabric-ca-server,不需要在输入密码。

接下来,注册一些身份,

# 这里可以切换目录,不然会覆盖之前的信息
fabric-ca-client register --id.name admin2 --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,admin=true:ecert'
返回密码VbUjIVUkoOcm

# 修改配置文件的id部分可以改默认参数,下面再注册一个
fabric-ca-client register --id.name admin3
wYuACyFxpUys
#注册一个节点身份,后面管理节点
fabric-ca-client register --id.name peer1 --id.type peer --id.affiliation org1.department1 --id.secret peer1pw
# enroll一个节点身份,enroll一个排序身份也是一样的(感觉这里应该是覆盖了之前的msp)
fabric-ca-client enroll -u http://peer1:peer1pw@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/msp

下面说道Idemix的用法,身份混合,似乎可以用来保护隐私

reenroll命令,如果证书过期了,重新来一下

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1  # 注意这里的路径
fabric-ca-client reenroll

revoke命令,撤销证书。

fabric-ca-client revoke -e <enrollment_id> -r <reason>
# 还有AKI和序列号方式 
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,文件存在/crls/crl.pem
fabric-ca-client revoke -e peer1 --gencrl

gencrl命令,生成收回的证书

export FABRIC_CA_CLIENT_HOME=~/clientconfig # 这里还是切换了目录,不然会覆盖之前的信息
fabric-ca-client gencrl -M ~/msp
#下面这句可以按时间收回
fabric-ca-client gencrl --caname "" --revokedafter 2017-09-13T16:39:57-08:00 --revokedbefore 2017-09-21T16:39:57-08:00 -M ~/msp

客户端启用TLS,就是配置文件中的tls部分。

大致就是 客户端,需要一个admin,然后才能注册其他东西。其他包括新的子组织,新的身份(identity)。
其实感觉实际使用不会这么多,一个节点可能就是一个身份(除了admin),然后会有很多很多容器节点,各种不同的节点

捋一下,客户端首先应该是自带了一个admin,然后客户端第一件事儿是生成admin凭证(密码自己设定)。
这时候有一个默认配置文件(其实节点名字啥的已经是admin了),然后msp文件夹是各种证书。
接下来可以生成其他用户(rigister),生成新用户不需要切换目录,还是原来那个目录,生成凭证(enroll)的时候需要切换一个新的目录,不然证书覆盖了。
生成用户时候可以指定一些属性,这个在官网都能找到。这个涉及到后面链码调用权限,这个就是Attribute-Based Access Control部分,基于属性控制访问。

identity命令还可以查询,更新,删除身份信息
affiliation命令也可以查询,更新,删除组织信息
certificate命令用来管理证书。

fabric-ca-client共有11个子命令:
affiliation (add list modify remove)管理组织相关
certificate (list) 证书相关,只能看
enroll 用来产生账户(身份)的凭证
gencrl 生成撤销证书列表
gencsr 为一个身份生成CSR(证书签名请求)
getcainfo 获取ca信息
identity (add list modify remove)管理身份相关
reenroll 重生成凭证(证书和私钥)
register 注册登记一个身份
revoke 撤销凭证(证书和私钥)
version 版本号
flag不算多:
学习记录:fabric-ca(1)-user guide_第3张图片这里有个疑问:不知道register命令和identity的add有什么区别???如果知道请告诉我。

总结一下,3部分功能:注册登记身份,产生身份的凭证,管理组织。

HSM

(这是没想到的一个,硬件)
默认私钥是存pem文件,但是也可以将它们配置为通过PKCS11 API将私钥存储在HSM(硬件安全模块)中。
在配置文件的BCCSP部分配置,现在只支持PKCS11标准和HSM设备通信。
教程给了一个以SoftHSM为例的示例。

文件格式

这个没东西,就是默认文件链接

问题

部署出问题先来这里看看。

参考

  • https://www.cnblogs.com/jxd283465/p/13086816.html
  • https://www.jianshu.com/p/bda8d3cbdbae
  • https://hyperledger-fabric.readthedocs.io/en/release-2.2/deployment_guide_overview.html#dg-step-two-set-up-a-cluster-for-your-resources
  • https://hyperledger-fabric-ca.readthedocs.io/en/latest/deployguide/ca-deploy-topology.html#what-ca-topology-will-you-use-on-your-network

你可能感兴趣的:(fabric,hyperledger,学习记录)