Fabric-CA 可以采用客户端命令行或 RESTful API 在内的两种方式与 Fabric-CA 服务端进行交互。其中最方便的方式是通过客户端工具 fabric-ca-client。
Fabric-CA 客户端的主目录路径设置如下:
--home
命令行选项,以此值为首选;--home
,则查找 FABRIC_CA_CLIENT_HOME
值;FABRIC_CA_HOME
值;CA_CFG_PATH
值;$HOME/.fabric-ca-client
作为客户端的主目录。fabric-ca-client 命令可以与服务端进行交互, 包括五个子命令:
这些命令在执行时都是通过服务端的 RESTful 接口来进行操作的。
打开一个新的终端,首先,设置 fabric-ca-client 所在路径,然后设置 Fabric-CA 客户端主目录。通过调用在 7054 端口运行的 Fabric-CA 服务器来注册 ID 为 admin 且密码为 pass 的标识。
$ export PATH=$PATH:$GOPATH/bin
$ export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
$ fabric-ca-client enroll -u http://admin:pass@localhost:7054
如果名称与密码不匹配, 则运行注册命令可能会产生如下错误:
Error: Response from server: Error Code: 20 - Authorization failure 解决方式: 删除生成的目录,之后使用启动服务时的用户名与密码注册 或 返回至目录下重新启动服务, 然后在新终端中使用 admin:pass 注册 $ cd ~ $ fabric-ca-server start -b admin:pass 打开新终端 $ export PATH=$PATH:$GOPATH/bin $ export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin $ fabric-ca-client enroll -u http://admin:pass@localhost:7054
参数解释:
enroll 命令访问指定的 Fabric-CA 服务,采用 admin 用户进行注册。 在 Fabric-CA 客户端主目录下创建配置文件 fabric-ca-clien-config.yaml
和 msp
子目录,存储注册证书(ECert),相应的私钥和 CA 证书链 PEM 文件。我们可以在终端输出中看到指示 PEM 文件存储位置的相关信息。
生成的文件结构如下所示:
$ tree fabric-ca/clients/
fabric-ca/clients/
└── admin
├── fabric-ca-client-config.yaml
└── msp
├── cacerts
│ └── localhost-7054.pem
├── keystore
│ └── 7441dddf832b4495cac12c05cc20b242f2ce545c5720010a83c11437157ac69d_sk
├── signcerts
│ └── cert.pem
└── user
提示:可以使用
$ tree fabric-ca/clients/
命令查看目录结构
注册成功后的用户可以使用 register 命令来发起登记请求:
Fabric-CA 服务器在注册期间进行了三次授权检查:
如下命令,使用管理员标识的凭据注登记 ID 为 “admin2” 的新用户,从属关系为 “org1.department1”,名为 “hf.Revoker” 的属性值为 “true”,以及属性名为 “admin”的值为 “true”。“:ecert” 后缀表示默认情况下,“admin” 属性及其值将插入用户的注册证书中,实现访问控制决策。
$ export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
$ fabric-ca-client register --id.name admin2 --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,admin=true:ecert'
执行后输出:
Configuration file location: /home/kevin/.fabric-ca-client/fabric-ca-client-config.yaml
Password: KwnOlOhpfVit
命令执行成功后返回该新登记用户的密码。
如果想使用指定的密码, 在命令中添加选项 --id.secret password 即可
登记时可以将多个属性指定为 -id.attrs 标志的一部分,每个属性必须以逗号分隔。对于包含逗号的属性值,必须将该属性封装在双引号中。如:
$ fabric-ca-client register -d --id.name admin2 --id.affiliation org1.department1 --id.attrs '"hf.Registrar.Roles=peer,user",hf.Revoker=true'
登记Peer或Orderer节点的操作与登记用户身份类似;可以通过 -M 指定本地 MSP 的根路径来在其下存放证书文件
下面我们登记一个名为 peer1 的节点,登记时指定密码,而不是让服务器为生成。
$ export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
$ fabric-ca-client register --id.name peer1 --id.type peer --id.affiliation org1.department1 --id.secret peer1pw
$ export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
$ fabric-ca-client enroll -u http://peer1:peer1pw@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/msp
参数说明:
命令执行成功后会在
$FABRIC_CA_CLIENT_HOME
目录下生成指定的 msp 目录, 在此目录下生成 msp 的私钥和证书。
通常,MSP 目录的 cacerts 目录必须包含其他证书颁发机构的证书颁发机构链,代表 Peer 的所有信任根。
以下内容将在 localhost上启动第二个 Fabric-CA 服务器,侦听端口 7055,名称为 “CA2”。这代表完全独立的信任根,并由区块链上的其他成员管理
$ export PATH=$PATH:$GOPATH/bin
$ export FABRIC_CA_SERVER_HOME=$HOME/ca2
$ fabric-ca-server start -b admin:ca2pw -p 7055 -n CA2
打开一个新终端,使用如下命令将CA2的证书链安装到peer1的MSP目录中
$ export PATH=$PATH:$GOPATH/bin
$ export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
$ fabric-ca-client getcainfo -u http://localhost:7055 -M $FABRIC_CA_CLIENT_HOME/msp
如果注册证书即将过期或已被盗用。可以使用 reenroll 命令以重新生成新的签名证书材料
$ export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
$ fabric-ca-client reenroll
身份或证书都可以被撤销,撤销身份会撤销其所拥有的所有证书,并且还将阻止其获取新证书。被撤销后,Fabtric CA 服务器从此身份收到的所有请求都将被拒绝。
使用 revoke 命令的客户端身份必须拥有足够的权限(hf.Revoker为true, 并且被撤销者机构不能超出撤销者机构的范围)
$ export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
$ fabric-ca-client revoke -e peer1 -r "affiliationchange"
参数说明:
命令执行后输出内容如下:
Configuration file location: /home/kevin/fabric-ca/clients/admin/fabric-ca-client-config.yaml
Sucessfully revoked certificates: [{Serial:21ed80434dd59cb1f80f89b85ebf55b3f677a54e AKI:1a99482cc8fe46349f0bd7ad7095985177708207} {Serial:4cf57dc2a8a70609e6eaaf3094e1ab3ff6aabe91 AKI:1a99482cc8fe46349f0bd7ad7095985177708207}]
另一种撤销身份的方式是可以指定其AKI(授权密钥标识符)和序列号来操作:
fabric-ca-client revoke -a xxx -s yyy -r <reason>
可以使用 openssl 命令获取 AKI 和证书的序列号,并将它们传递给 revoke
命令以撤销所述证书,如下所示:
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
AKI: 公钥标识号, 代表了对该证书进行签发机构的身份
查看根证书的AKI与序列号信息:
$ openssl x509 -in $FABRIC_CA_CLIENT_HOME/msp/signcerts/cert.pem -text -noout
输出内容如下:
Certificate:
Data:
Version: 3 (0x2)
Serial Number: # 序列号
74:48:88:33:70:1a:01:a0:ad:32:29:6e:c5:ab:5a:fa:3b:91:25:a4
......
X509v3 extensions:
......
X509v3 Authority Key Identifier: # keyid后面的内容就是 AKI
keyid:45:B1:50:B6:CD:8A:8D:C5:9B:9E:5F:75:15:47:D6:C0:AD:75:FE:71
......
$ openssl x509 -in $FABRIC_CA_CLIENT_HOME/msp/signcerts/cert.pem -text -noout | awk '/keyid/ {gsub (/ *keyid:|:/,"",$1);print tolower($0)}'
输出内容如下:
1a99482cc8fe46349f0bd7ad7095985177708207
$ openssl x509 -in $FABRIC_CA_CLIENT_HOME/msp/signcerts/cert.pem -serial -noout | cut -d "=" -f 2
输出内容如下:
4CF57DC2A8A70609E6EAAF3094E1AB3FF6AABE91
在实际的生产环境中 Fabric-CA 需要考虑哪些问题?
采用PKI推荐的分层结构,即根 CA、中间 CA 甚至根据实际需求场景更深层的 CA 来实现对身份的管理;
为了实现高可用的负载均衡,正如官方推荐的使用 HA Proxy 软件或 Nginx等来部署集群环境。