sudo apt install libtool libltdl-dev
# 官方文档上就是这么写的
go get -u github.com/hyperledger/fabric-ca/cmd/...
如果你go get没有成功,那么需要手动从github上克隆一个项目
git clone https://github.com/hyperledger/fabric-ca.git
这里我切换到了fabric-ca的1.4版本进项使用
git checkout release-1.4
cd fabric-ca/
make fabric-ca-server
make fabric-ca-client
cp fabric-ca-server /usr/bin
cp fabric-ca-client /usr/bin
# serveradmin是server端管理员账号,123456是密码
fabric-ca-server init -b serveradmin:123456
# 后台运行server端,并且重定向日志信息到指定文件
fabric-ca-server start -b serveradmin:123456 > /root/fabric-ca/server.out
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
--home
设置。FABRIC_CA_CLIENT_HOME
环境变量,则使用该环境变量作为主文件夹。FABRIC_CA_HOME
环境变量,则使用该环境变量作为主文件夹。CA_CFG_PATH
环境变量,则使用该环境变量作为主文件夹。$HOME/.fabric-ca-client
将作为主文件夹。fabric-ca-client enroll -u http://serveradmin:123456@localhost:7054
.
├── fabric-ca-client-config.yaml
└── msp
├── IssuerPublicKey
├── IssuerRevocationPublicKey
├── cacerts
│ └── localhost-7054.pem #CA服务器的根证书,只不过换了一个名字
├── keystore
│ └── 7ec84cbc25c20600ba98bf2bafb9c695ad57e392a57fb9f33b51fc493601a432_sk #当前用户的秘钥信息
├── signcerts
│ └── cert.pem #当前用户的证书
└── user
注册一个身份
通过Fabric-CA
注册新的身份时,将由Fabric-CA
服务器进行三个部分的权限检查确定当前用户是否具有权限进行身份的注册。
注册者必须含有hf.Registrar.Roles
属性,并且需要注册的身份类型必须在该属性对应的值的列表中存在。比如注册者的hf.Registrar.Roles
属性中对应的值只有一个peer
,那么注册者使能注册类型为peer
的身份,而不能注册client,admin,orderer
.如果注册者的hf.Registrar.Roles
属性对应的值为*
,则说明可以注册任何类型的身份。
简单说就是上下级关系,比如注册者所处的部门为a.b
,那么他只能注册处于a.b
以及a.b.*
部门的身份,而不能注册处于a.c
部门的身份。如果需要注册一个最上级的部门的身份,那么需要将需要将需要注册的身份的hf.affiliation
指定为.,并且注册者所处的部门也需要是最上级的部门。如果在注册身份时没有指定所属的部门,则默认被注册的身份所处的部门与注册者部门相同。
如果注册者满足以下条件则可以注册带有属性的身份:
Fabric CA
中的保留属性(前缀以hf
开头的):只有注册者具有这个属性并且是hf.Registrar.Attributes
属性中的值的一部分。也就是说如果需要注册一个带有hf.a
属性的身份,那么注册者自己也需要有这个属性,并且在注册者的hf.Registrar.Attributes
属性对应的值中需要包含hf.a
这个属性。并且hf.a
这个属性的值是一个列表,那么被注册的身份具有的hf.a
属性只能等于或者等于列表中的一个子集。另外,如果hf.a
这个属性的值对应的是一个布尔值,那么需要注册者hf.a
属性的值为true
。Fabric Ca
中的保留属性):注册者hf.Registrar.Attributes
对应的值需要包括这个属性,或者是已经注册过的模式。唯一支持的模式是以*
结尾的字符串。比如注册者hf.Registar.Attributes
对应的值为a.b.*
,那么他可以注册的属性需要以a.b.
开头。如果注册者hf.Registar.Attributes
对应的值为orgAdmin
,那么注册者只可以对一个身份进行添加或者删除orgAdmin
属性.hr.Registrar.Attributes
属性:一个额外的检查是该属性对应的值需要等于注册者具有的该属性对应的值,或者是注册者具有的该属性对应的值的子集。对于这些的具体解释可以看这一篇博客:博客传送门
使用刚才登陆的admin
身份注册一个身份:
enrollment id
为admin2
部门为org1.department1
属性名字为hf.Revoker
,对应的值为true
属性名字为admin
,对应的值为true
fabric-ca-client register --id.name admin2 --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,admin=true:ecert'
其中对于属性admin=true,后缀为ecert表示这条属性将会添加到证书中,可以用来进行做访问控制的决定。这里密码没有自己设置,系统给出一个密码(gqvBHqvZrupb)。
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register --id.name peer2 --id.type peer --id.affiliation org1.department1 --id.secret 123456
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer2
fabric-ca-client enroll -u http://peer2:123456@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/msp
fabric-ca-client identity list
fabric-ca-client identity list --id peer1
fabric-ca-client identity remove peer1
注意:在默认情况下,Fabric CA服务器是禁用身份的删除的,但可以通过设置–cfg.identities.allowremove选项启动Fabric CA服务器启用。如果未启用则会删除失败,重新启动CA服务器端,并且再次运行以上命令,发现peer1确实被删除了:
nohup fabric-ca-server start -b serveradmin:123456 --cfg.identities.allowremove --cfg.affiliations.allowremove > /root/fabric-ca/server.out &
fabric-ca-client revoke -e <enrollment_id>
被撤销的用户无法登陆,但是可以在管理员的用户列表中看见这个用户。
# 用户需要有 hf.AffiliationMgr 属性,否则报错,Error: Response from server: Error Code: 0 - User does not have attribute 'hf.AffiliationMgr'
fabric-ca-client affiliation list
# 注册一个org1的管理员,同时具有撤销证书权限与组织管理的权限
fabric-ca-client register --id.name org1admin1 --id.affiliation org1 --id.secret 123456 --id.attrs 'hf.Revoker=true,hf.AffiliationMgr=true,hf.Revoker=true,admin=true:ecert'
登陆这个组织1的管理员然后我们使用查看组织信息的命令,因为这个是组织1的管理员,所以只能看到组织1的所有信息,如果使用server的admin就可以查看到所有的组织信息:
注意:在默认情况下,Fabric CA服务器是禁用身份的删除的,但可以通过设置–cfg. affiliations.allowremove选项启动FabricCA服务器启用。