区块链在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。
本记录不提供完全的翻译,只是自己的学习心得。
(目录没用,请用侧边栏自带的目录)
这东西提供3个功能:
fabric中说建议用这个,除了证书,这东西还能管理MSP(用户身份服务提供器),所以比较方便。
官网的图一开始没理解,是这样3点:
按章操作即可,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这两个命令,有些共性的东西在这里说了:
运行产生了一个文件夹,映射到容器内,这里面都是ca服务器的内容。这个文件夹里的东西就是容器内的,改动会影响容器内,在容器内用ls查看也是一样结构。
初始化,如果按照上面操作,产生一个文件夹,fabric-ca-server,里面一大堆东西,都是服务器配置相关,最重要的是一个fabric-ca-server-config.yaml文件,这就是默认的服务器配置文件了,等下改这个。
home的路径决定:
接下来教程假定设置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 端口相关
这个慢慢了解吧,先看懂配置文件才是重点。
home的路径决定:
这里遇到个尴尬的事情,那个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不算多:
这里有个疑问:不知道register命令和identity的add有什么区别???如果知道请告诉我。
总结一下,3部分功能:注册登记身份,产生身份的凭证,管理组织。
(这是没想到的一个,硬件)
默认私钥是存pem文件,但是也可以将它们配置为通过PKCS11 API将私钥存储在HSM(硬件安全模块)中。
在配置文件的BCCSP部分配置,现在只支持PKCS11标准和HSM设备通信。
教程给了一个以SoftHSM为例的示例。
这个没东西,就是默认文件链接
部署出问题先来这里看看。