今天我们来具体说一下Fabric中的CA。
Fabric CA 架构的组成
Fabric CA 实现了一整套PKI公钥基础设施,可以用来生成MSP中所需的全部证书,其主要功能是对MSP中的 成员身份证书 进行管理,包括生成、签名、撤销等功能。
需要注意的是,一旦MSP成员的证书被部署,该成员就可以访问Fabric网络中的各项资源,而不需要进行重复的申请,因此,Fabric CA 是不会对系统的性能造成任何影响的。
Fabric CA 是属于典型的CS架构,第一部分是Fabric CA Server
,它是一个提供REST API接口的Server,默认监听在7054
端口;另一个部分是Fabric CA Client
,客户端包括命令行工具以及Fabric CA SDK
开发包,我们可以看到,无论是服务器端,还是客户端,它都是通过REST API
进行的。前者实现的是以命令行的形式操作CA证书,后者是以编程方式操作CA证书。
Fabric CA Server
可以将生成的证书的属性信息写入到关系数据库
或者LDAP目录服务器
中,在Fabric CA Server
服务器中,默认使用的是关系型数据库SQLite
。而且,Fabric CA Server
还可以实现高可用的集群模式,例如是用HA-Proxy
的负载均衡代理软件实现对集群方式的部署,这样一来,集群中的所有服务器都可以共享相同的数据库。
为了安全起见,CA机构大多会采用根证书+中间证书的根证书链的实现方案。这样一来,多级中间证书可以在很大程度上降低根证书的管理负担,如果中间证书的私钥泄露或者过期,只需要讲这个中间证书吊销并给用户颁发新的证书即可。但无论如何,一定要保证Root CA
生成环境的安全性,确保这一私钥不会被泄露。
Fabric CA 安装及功能
关于Fabric CA Server
的配置信息,我们可以通过fabric-ca-server-config.yaml
进行配置以及相关信息的查询。
首先关于初始管理员admin
的信息如下:
# Contains identity information which is used when LDAP is disabled
identities:
- name: admin
pass: adminpw
type: client
affiliation: ""
attrs:
hf.Registrar.Roles: "client,user,peer,validator,auditor,ca"
hf.Registrar.DelegateRoles: "client,user,validator,auditor"
hf.Revoker: true
hf.IntermediateCA: true
其中hf.Registrar.Roles
部分的属性定义客户端可以注册的证书类型。
接下里是用于签名证书的CA根证书的配置信息:
ca:
# Name of this CA
name:
certfile: ca.crt
keyfile: ca.key
# Chain file (default: chain-cert.pem)
chainfile: ca-chain.pem
最后一个属性定义了被CA根证书所信任的证书,如果配置好最后一个属性,那么它与CA根证书certfile
一起形成证书链。
下一个是CSR(证书签名请求)部分的定义:
csr:
cn: fabric-ca-server
names:
- C: US
ST: "North Carolina"
L:
O: Hyperledger
OU: Fabric
hosts:
- 2008f00aff38
ca:
pathlen:
pathlenzero:
expiry:
如果在生成CSR的时候没有提供相应的属性,那么就会使用上述默认值。
证书签名也有一些相关默认的属性,其中最重要的是证书的有效期:
signing:
profiles:
ca:
usage:
- cert sign
expiry: 8000h
caconstraint:
isca: true
default:
usage:
- cert sign
expiry: 8000h
关于生成证书使用的椭圆加密算法,以及其密码强度:
bccsp:
default: SW
sw:
hash: SHA2
security: 256
filekeystore:
# The directory used for the software file-based keystore
keystore: /var/hyperledger/fabric-ca-server/keystore
有关存储数据库的定义:
db:
type: sqlite3
datasource: /var/hyperledger/fabric-ca-server/state.db
tls:
enabled: false
certfiles:
- db-server-cert.pem
client:
certfile: db-client-cert.pem
keyfile: db-client-key.pem