超级账本Fabcri-8.证书应用与配置
1. 简介
Fabric CA项目是超级账本Fabric内的MemberService组件, 对网络内各个实体的身份证书的管理, 主要实现:
- 负责Fabric网络内所有实体(Identity)的身份管理, 包括身份的注册、注销等
- 负责证书管理, 包括ECerts(身份证书)、TCerts(交易证书)等的发放和注销
- 服务端支持基于客户端命令行的RESTful API的交互方式
Fabric CA采用Go语言进行编写
2. 基本组件
Fabric CA采用了典型的C/S架构, 目前包含两个基本组件, 分别实现服务端功能和客户端功能
- 服务端: fabric-ca-server实现核心的PKI(Public Key Infrastructure: 公钥基础设施)服务功能, 支持多种数据库后台(包括SQlite3、MySQL、PostgreSQL等), 并支持集成LDAP用为用户注册管理功能
- 客户端: fabric-ca-client封装了服务端的RESTful API, 提供访问服务端的命令, 供用户与服务端进行交互
3. 安装服务端与客户端
安装Go1.9+
设置GOPATH环境变量
3.1 安装libtool 与 libltdl-dev 依赖包
1 | $ sudo apt update |
安装
安装服务端与客户端二进制命令到$GOPATH/bin目录下
1 | $ go get -u github.com/hyperledger/fabric-ca/cmd/... |
切换至源码目录下:
1 | $ cd $GOPATH/src/github.com/hyperledger/fabric-ca/ |
使用make命令编译:
1 | $ make fabric-ca-server |
生成 bin
目录, 目录中包含 fabric-ca-client
与 fabric-ca-server
两个可执行文件
设置环境变量
1 | $ export PATH=$GOPATH/src/github.com/hyperledger/fabric-ca/bin:$PATH |
3.2 初始化
返回至用户目录
1 | $ cd ~ |
fabric-ca启动:
1. 使用init进行初始化
2. 使用start启动
初始化
1 | $ fabric-ca-server init -b admin:pass |
生成配置文件到至当前目录
- fabric-ca-server-config.yaml: 默认配置文件
- ca-cert.pem: PEM格式的CA证书文件, 自签名
- fabric-ca-server.db: 存放数据的sqlite数据库
- msp/keystore/: 路径下存放个人身份的私钥文件(_sk文件), 对应签名证书
3.3 快速启动
快速启动并初始化一个fabric-ca-server服务
1 | $ fabric-ca-server start -b admin:pass |
-b: 提供注册用户的名称与密码, 如果没有使用LDAP, 这个选项为必需. 默认的配置文件的名称为fabric-ca-server-config.yaml
如果之前没有执行初始化命令, 则启动过程中会自动先进行初始化操作. 即从主配置目录搜索相关证书和配置文件, 如果不存在则会自动生成
3.4 RESTful API
在打开的新终端中输入以下命令获取指定CA服务的基本信息.
1 | $ curl -X POST -d '{"caname":"test_ca"}' http://localhost:7054/api/v1/cainfo |
如要获取默认CA服务的基本信息, 可以不带任何参数, 如:
1
2 > $ curl -X POST http://localhost:7054/api/v1/cainfo
>
4. 服务端命令剖析
fabric-ca-server命令主要负责启动一个CA服务, 包括init和start两个子命令
4.1 服务端配置文件解析
fabric-ca-server-config.yaml配置文件包括通用配置, TLS配置, CA配置, 注册管理配置, 数据库配置, LDAP配置, 组织结构配置, 签名, 证书申请等几部分
1 | version: 1.1.1-snapshot-e656889 |
4.2 与服务器端进行交互
可以采用包括RESTful API在内的多种方式与Fabric-CA服务端进行交互. 其中最方便的方式是通过客户端工具 fabric-ca-client
4.3 登记用户
注册管理员需要以管理员身份使用CA Client连接到CA Server,并生成相应的文件
1 | $ export PATH=$GOPATH/src/github.com/hyperledger/fabric-ca/bin:$PATH |
如果生成的配置文件不是在当前目录下, 则运行登记命令后可能会产生如下错误
1
2
3
4
5 > Error: Response from server: Error Code: 20 - Authorization failure
> 解决方式: 返回至目录下重新启动服务
> $ cd ~
> $ fabric-ca-server start -b admin:pass
>
-u: 进行连接的fabric-ca-server服务地址, 默认为”http://localhost:7054"
该命令访问本地Fabric CA服务, 采用默认的admin用户进行登记. 默认情况下会在用户目录下的.fabric-ca-clien子目录下创建默认的配置文件 fabric-ca-clien-config.yaml
和 msp
子目录(包括签发的证书文件)
可以使用
$ tree .fabric-ca-client/
命令查看结构
4.4 注册用户
登记后的用户身份可以采用如下命令来注册一个新的用户:
1 | $ fabric-ca-client register --id.name kevin --id.type user --id.affiliation org1.department1 --id.attrs '"hf.Registrar.Roles=peer,user"' --id.attrs 'hf.Revoker=true' |
执行后输出:
1 | 2018/05/02 14:39:28 [INFO] Configuration file location: /home/kevin/.fabric-ca-client/fabric-ca-client-config.yaml |
命令执行成功后返回该新注册用户的密码
如果想使用指定的密码, 在命令中添加选项 –id.secret password 即可
可以再次使用enroll命令,给kevin这个用户生成msp的私钥和证书
1 | $ fabric-ca-client enroll -u http://kevin:KDwrXkAFENWW@localhost:7054 -M kevinca |
-M: 指定生成证书存放目录MSP的路径, 默认为”msp”
命令执行成功后会在
.fabric-ca-client
目录下生成指定的userca目录, 在此目录下生成msp的私钥和证书可使用tree使用查看
1
2 > $ tree .fabric-ca-client/
>
输出内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 > .fabric-ca-client/
> ├── fabric-ca-client-config.yaml
> ├── kevinca
> │ ├── cacerts
> │ │ └── localhost-7054.pem
> │ ├── intermediatecerts
> │ │ └── localhost-7054.pem
> │ ├── keystore
> │ │ ├── 8c7e4d893af9b9a5907299097edd69c9adee743f4421f81a2d73ed55a874545e_sk
> │ │ └── ec63821399143fc422e01596eca622e8c658c0ded8e5c189804180256c40c19e_sk
> │ └── signcerts
> │ └── cert.pem
> ├── msp
> ├── cacerts
> │ └── localhost-7054.pem
> ├── intermediatecerts
> │ └── localhost-7054.pem
> ├── keystore
> │ └── eaa009831dc406950766cc1df104f6fb3ed4b456faa5f476dc41db817a873d2a_sk
> └── signcerts
> └── cert.pem
>
4.5 登记节点
登记Peer或Orderer节点的操作与登记用户身份类似. 可以通过-M指定本地MSP的根路径来在其下存放证书文件
4.5.1 注册节点
1 | $ fabric-ca-client register --id.name peer0 --id.type peer --id.affiliation org1.department1 --id.secret peer0pw |
4.5.2 登记节点
1 | $ fabric-ca-client enroll -u http://peer0:peer0pw@localhost:7054 -M peer0 |
5. 客户端命令剖析
fabric-ca-client命令可以与服务端进行交互, 包括五个子命令:
- enroll: 登录获取ECert
- getcacert: 获取CA服务的证书链
- reenroll: 再次登录
- register: 注册用户实体
- revoke: 吊销签发的实体证书
这些命令都是通过服务端的RESTful接口来进行操作的
5.1 enroll命令
向服务端申请签发ECert证书并将文件保存至本地
1 | $ fabric-ca-client enroll -u http://admin:pass@localhost:7054 |
5.2 getcacert命令
向服务端申请根证书信息并保存至本地主配置目录的msp/cacerts路径下
1 | $ fabric-ca-client getcacert -u http://admin:pass@localhost:7054 |
证书命名格式为: 服务器主机名-CA实例名.pem
5.3 reenroll命令
利用本地配置信息再次执行enroll过程, 生成新的签名证书材料
1 | $ fabric-ca-client reenroll |
5.4 register命令
执行注册新用户实体的客户端必须已经通过登记认证, 并且拥有足够的权限(所注册用户的hf.Registrar.Roles和affiliation都不能超出调用者属性)来进行注册
1 | $ fabric-ca-client register --id.name jack --id.type user --id.affiliation org1.department1 --id.attrs '"hf.Registrar.Roles=peer,user"' --id.attrs 'hf.Revoker=true' --id.secret jackpw |
5.5 revoke命令
吊销指定的证书或指定实体相关的所有证书. 执行revoke命令的客户端身份必须拥有足够的权限(hf.Revoker为true, 并且被吊销者机构不能超出吊销者机构的范围)
1 | $ fabric-ca-client revoke -e "jack" -r "affiliationchange" |
-e: 指定吊销用户
-r: 指定吊销原因
输出内容如下
1 | 2018/05/02 17:55:44 [INFO] Configuration file location: .fabric-ca-client/fabric-ca-client-config.yaml |
6. 查看AKI和序列号
AKI: 公钥标识号, 代表了对该证书进行签发机构的身份
查看根证书的AKI与序列号信息:
1 | $ openssl x509 -in .fabric-ca-client/msp/signcerts/cert.pem -text -noout |
输出内容如下:
1 | Certificate: |
6.1 单独获取AKI
1 | $ openssl x509 -in .fabric-ca-client/msp/signcerts/cert.pem -text -noout | awk '/keyid/ {gsub (/ *keyid:|:/,"",$1);print tolower($0)}' |
输出内容如下:
1 | 45b150b6cd8a8dc59b9e5f751547d6c0ad75fe71 |
6.2 单独获取序列号
1 | $ openssl x509 -in .fabric-ca-client/msp/signcerts/cert.pem -serial -noout | cut -d "=" -f 2 |
输出内容如下:
1 | 74488833701A01A0AD32296EC5AB5AFA3B9125A4 |