团队
介绍
我们是光大科技有限公司智能化平台团队区块链项目组,致力于构建集团区块链基础设施平台,提供区块链技术在金融行业的完备解决方案,降低区块链的开发、运维难度,助力集团数字化转型。我们团队拥有经验丰富的区块链领域技术专家和研发工程师,将不定期分享区块链及相关领域的技术文章和解决方案,和大家共同探索金融行业区块链技术的落地实践和发展趋势。
CA(certificate authority)是指一个被多个用户信任的证书签发机构,负责签发证书、认证证书、管理已颁发的证书。目前HTTPS协议中保证通讯安全所依赖的证书,就是通过CA签发证书来实现的。
若一个用户想得到一份属于自己的证书,需先向CA提出申请,并提交自己的公钥到CA(也可由CA统一生成公私钥对)。当CA判明申请人的身份后,会使用自己的私钥将申请人的身份信息、公钥和证书过期时间等信息一起加密,生成数字证书,分发给申请者,这就是颁发证书的过程。
证书的验证过程就简单很多了。如果用户想鉴别证书的真伪,只需要使用CA的公钥去解密数字证书,一旦验证通过,即可认为该证书是有效的。那么问题来了,如何知道我们拿到的CA公钥不是伪造的呢?解决方案就是再找一个证书颁发机构,对当前CA的公钥颁发一个证书,这样循环嵌套所形成的就是我们常说的证书链。而这个循环的终点就是根CA,根CA的公钥则通过安全的方式进行发布。通常我们使用的浏览器都会内置有根CA证书。
在Fabric网络中,CA同样是基于PKI(Public Key Infrastructure)的身份证书管理服务,是联盟链企业级场景下信任的的基石。
主要提供了以下功能:
-
提供Fabric 网络里所有实体成员身份的管理,包括身份注册、注销;
-
提供Fabric 网络的证书管理,包括发布身份证书ECert和发放交易证书TCert;
-
提供基于Restful API和基于客户端命令的的交互功能。
Fabric CA的整体架构如下图所示,包括一个根CA的服务,以及中间CA集群,通过CA-Client或SDK进行服务调用,颁发证书给网络中的各个节点使用。
图片来源于网络
Fabric CA运行过程大概包括以下几个步骤:
-
服务端的初始化
-
根证书生成
-
启动服务
-
客户端向服务端请求注册登记
-
服务端返回登记的证书ECert
-
客户端请求注册节点
-
服务端返回节点注册信息结果
-
客户端向服务端请求登记节点
-
服务端生成证书TCert并存入DB中
-
服务端返回节点登记结果
运行时序图如下:
图片来源于网络
01
Fabric-CA Server
启动fabric-ca server的命令很简单:
fabric-ca-server start -b <admin>:<adminpw>
-b 参数代表“启动身份”(bootstrap identity)选项。启动服务器必须要有启动身份; 这个身份就是管理员身份。如果Fabric CA server没有启用LDAP,那么必须在命令中携带-b选项并指定至少一个引导用户。
Fabric CA server的home目录是这样设定的:如果设置了FABRIC_CA_SERVER_HOME环境变量就取它的值,否则就用当前的工作目录。
第一次启动时,如果服务器未初始化,则会先进行初始化。在初始化期间,如果发现home目录下ca-cert.pem不存在,则会生成一个自签名的证书,这个证书可以作为根证书或者中间证书,如果配置文件不存在也会生成默认的配置文件。 初始化后,再次启动的时候,直接运行fabric-ca-server start命令就好了。
Fabric CA server默认使用的数据库是SQLite数据库,如果在生产环境中部署CA Server,建议使用PostgreSQL或者MySQL,可以通过修改配置文件设置数据库;在生产环境中一般创建多个Fabric CA server,使用HA proxy 或其他工具构建一个cluster,实现CA server 的高可用性。
02
Fabric-CA Client
获取Fabric CA Server 颁发的证书主要途径有两种:一种是通过代码中调用CA Server的API/SDK,一种是使用Fabric CA Client工具,client其实也是封装了CA Server的各种API。
一个证书账号的生命周期如下图所示:
register字面的意思是注册,注册就是一个实体或者组织向CA自我介绍的过程;register操作会将实体的ID、密码、类型等属性告诉CA Server,并保存到Server的数据库中。
enroll字面的意思是登记,就是最终实体用注册过的ID、密码等属性进行证书申请,并从CA接收证书的过程。
这是申请证书必不可少的两个步骤,咱们来详细描述下这个过程。
登记引导身份
假设本地已经启动了一个Fabric CA Server
fabric-ca-server start -b admin:adminpw –port 7054
本地先声明一个环境变量,指定fabric ca client的工作目录,如果未指定,默认工作目录在$HOME/.fabric-ca-client
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
进行引导身份登记
fabric-ca-client enroll -u http://admin:adminpw@localhost:7054
enroll命令会生成一份enrollment 证书 (ECert), 以及对应的私钥文件和CA根证书 PEM 文件 ,保存在Fabric CA client的 msp 子目录下。
注册新身份
Fabric CA server制定了如下3种权限检验规则:
-
注册者必须拥有hf.Registrar.Roles属性,其中的一个值与被注册身份的类型相同。例如注册User身份,则注册者的hf.Registrar.Roles属性中必须包含User值。
-
注册者的组织关系必须与被注册身份相同或者是被注册身份组织关系的前缀。例如注册者组织关系为a.b,则被注册身份可以为a.b或a.b.*。
-
注册者可以注册带有属性的用户,当且仅当满足如下情况:
-
注册者可以注册以“hf”为前缀的Fabric CA保留属性,注册者拥有保留属性且取值必须是hf.Registrar.Attributes属性中的值。如果属性是类型列表,则被注册的属性的值必须等于或是注册者具有的值的子集。如果属性为布尔类型,则注册者只有在该属性值为“true”时才能注册该属性。具体要看CA Server的属性配置。
-
注册非“hf”前缀的自定义属性,要求注册者拥有hf.Registrar.Attributes属性和值或属性和模式表达式。如果注册者有hf.Registrar.Attributes=ad*,那么注册者可以从身份添加或删除的属性就是以“ad”为前缀的属性。
-
如果请求的属性名是以hf为前缀的保留属性,则会进行额外的检查,以查看该属性值是否为注册者相同属性值的子集。
示例如下:
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register –id.name admin2 –id.type user –id.affiliation org1.department1 –id.attrs \’hf.Revoker=true,admin=true:ecert\’
上面的命令以admin身份证书注册了一个id为admin2,类型是user,组织关系为org1.department1的用户,并提供了hf.Revoker的保留属性和admin的自定义属性(:ecert表示该属性名和值会插入到登记证书中)。
fabric-ca-client register -d –id.name peer1 –id.secret peer1PW –id.type peer -u https://0.0.0.0:7054
这个命令以admin身份证书注册了一个id 为peer1,密码为peer1PW,类型是peer的用户。
登记身份,获取证书
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
该命令执行完,在msp目录下,就可以获得peer1主体的证书了。
目录结构如下:
cacerts目录下的证书是CA的根证书;
Keystore目录下存的是peer1节点的私钥;
Signcerts目录下是CA给peer1颁发的证书。
03
Fabric-CA Client其他常用命令
重新登记身份
假设证书即将过期,可以通过如下命令重新登记身份。
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
fabric-ca-client reenroll
撤销证书或身份
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
fabric-ca-client revoke -e <enrollment_id> -r <reason>
修改身份
fabric-ca-client identity modify user1 –json \'{\”secret\”: \”newPassword\”, \”affiliation\”: \”.\”, \”attrs\”: [{\”name\”: \”hf.Regisrar.Roles\”, \”value\”: \”peer,client\”},{\”name\”: \”hf.Revoker\”, \”value\”: \”true\”}]}\’
移除身份
fabric-ca-client identity remove user1
以上就是fabric CA的简单操作。fabric CA官方的文档尚未完工,也有好多没有交代清楚,甚至是错误的东西,很多地方需要自己一步步摸索。后续,会给大家分享基于fabric CA构建认证网络。
扫描二维码 |关注我们
作者:栗石
原创文章,作者:EBCloud,如若转载,请注明出处:https://www.sudun.com/ask/32629.html