Fabric CA为Hyperledger Fabric行使证书机构的功能。
Fabric CA提供以下功能:
Fabric CA 包含一个服务端组件和一个客户端组件
下图说明了 Fabric CA 服务端如何在 Hyperledger Fabric 架构中发挥作用
fabric ca源码 https://github.com/hyperledger/fabric-ca
使用文档 https://hyperledger-fabric-ca.readthedocs.io/en/latest/
需要安装两个包
centos yum install libtool libtool-ltdl-devel
ubuntu apt install libtool libltdl-dev
Fabric CA 提供3种方式来配置 fabric-ca-server 和 fabric-ca-client 。优先级如下:
配置优先级由高到低依次为命令行参数 > 环境变量 > 配置文件
配置文件的修改可以被环境变量或者命令行参数覆盖
fabric-ca-server 和 fabirc-ca-client 的配置文件里的所有属性都支持相对路径和绝对路径。相对路径是相对于配置目录,即配置文件所在的目录
实验步骤:
export FABRIC_CA_SERVER_HOME=/opt/gopath/src/github.com/hyperledger/fabric-ca-server
export FABRIC_CA_CLIENT_HOME=/opt/gopath/src/github.com/hyperledger/fabric-ca-client
初始化fabric-ca服务端
fabric-ca-server init -b admin:adminpw
-b 选项指定了引导身份的用户名和密码
[root@localhost hyperledger]# ls fabric-ca-server/
ca-cert.pem fabric-ca-server-config.yaml fabric-ca-server.db msp
ca-cert.pem是CA中心的根证书,用自己的私钥自签名,证书包含自己的公钥,用于验证其它签名证书的有效性
fabric-ca-server-config.yaml为CA服务端配置文件
fabric-ca-server.db是存储注册用户和证书的数据库
msp/keystore里存放的是CA中心的私钥,用于生成根证书和其它证书
启动fabric服务端
fabric-ca-server start -b admin:adminpw
登陆刚才引导注册的身份,取得登陆用户CA证书
fabric-ca-client enroll -u http://admin:adminpw@localhost:7054
[root@localhost hyperledger]# ls fabric-ca-client/
fabric-ca-client-config.yaml msp
fabric-ca-client-config.yaml是CA客户端的配置文件
msp/cacerts存放的是根证书(与CA服务端根证书相同)
msp/keystore存放的是登陆用户的私钥
msp/signcerts存放的是登陆用户的身份证书,证书由CA服务端私钥签名,证书包含了登陆用户的身份信息和公钥
注册一个新的身份证
只有已经登录了的身份才能发起注册的请求,而且必须有相应的权限来注册想要注册的身份类型
fabric-ca-client register --id.name zhaolong--id.type user --id.affiliation org1.department1 --id.attrs hf.Revoker=true
会显示密码:
Password: qNRdsGhrPnYE
密码会被打印出来,登录这个新注册的身份的时候,需要用到这个密码。这允许一个管理员注册身份,然后把这个身份的ID和密码给别人来登陆。
注册一个节点身份,在这里我们选择指明自己的密码,而不是由服务器生成
fabric-ca-client register --id.name peer1 --id.type peer --id.affiliation org1.department1 --id.secret peer1pw
登陆一个节点
export FABRIC_CA_CLIENT_HOME=/opt/gopath/src/github.com/hyperledger/fabric-user/peer1
fabric-ca-client enroll -u http://peer1:peer1pw@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/msp
-M选项允许你指定登陆节点CA证书存储在哪
从另一个Fabric CA服务器获得CA证书链
下面的命令会在本地启动第二个Fabric CA服务器,监听7055端口,命名为“CA2“。这代表两个由不同成员管理的分开的信任中心。
export FABRIC_CA_SERVER_HOME=/opt/gopath/src/github.com/hyperledger/fabric-ca-server2
fabric-ca-server start -b admin:ca2pw -p 7055 -n CA2
下面的命令会把CA2的证书链安装进peer1的MSP2目录,也就是取得CA2的根证书
export FABRIC_CA_CLIENT_HOME=/opt/gopath/src/github.com/hyperledger/fabric-user/peer1
fabric-ca-client getcacert -u http://localhost:7055 -M $FABRIC_CA_CLIENT_HOME/msp2
重新登陆一个身份
假设你的登陆证书快过期了,你可以重新登陆来替换你的登陆证书(ECert)
export FABRIC_CA_CLIENT_HOME=/opt/gopath/src/github.com/hyperledger/fabric-user/peer1
fabric-ca-client reenroll
登陆超时时间由expiry字段指定
撤销一个证书或身份
身份和证书都能被撤销。撤销一个身份会撤销该身份拥有的所有证书,该身份也不能再获得新的证书。撤销一个证书会使该证书失效。
为了撤销一个证书或身份,发起者必须有hf.Revoker属性。发起者只能撤销与自己的affiliation相同的证书或身份,或者发起者的affiliation是被撤销者的affiliation的前缀
撤销peer1的身份
export FABRIC_CA_CLIENT_HOME=/opt/gopath/src/github.com/hyperledger/fabric-ca-client
fabric-ca-client revoke -e peer1
一个身份可以撤销自己的登陆证书(ECert),需要指定ECert的AKI和序列号:
fabric-ca-client revoke -a xxx -s yyy -r
可以通过openssl命令来获取一个证书的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