Fabric CA的基础知识

:简介

 e2e_cli的例子中,所有用到的证书和私钥都是由cryptogen这个工具根据crypto-config.yaml而生成的。但是在实际的生产环境中,我们需要给每个org都建立自己的CA,用来管理本org的用户。所以需要部署ca serverclient去进行操作。本文就是进行fabric CA的知识点整理。Fabric CA的整体结构如下所示:

 Fabric CA的基础知识

从图中可以知道:和ca server进行交互可以通过两种途径,fabric-CA-clientSDK。所有和fabric CA server进行交互都是通过调用REST APIs进行操作的。

Hyperledger Fabric CA客户端或SDK可能连接到Hyperledger Fabric CA服务器集群时。 这在图的右上部分中说明。 客户端路由到HA代理端点,该端点将流量负载平衡到fabric-ca-server集群成员之一。

集群中的所有Hyperledger Fabric CA服务器都共享相同的数据库以跟踪身份和证书。 如果配置了LDAP,则身份信息将保存在LDAP中而不是数据库中。

一台服务器可能包含多个CA。 每个CA都是根CA或中间CA. 每个中间CA都有一个父CA,它是根CA或另一个中间CA.

二:使用(命令)

(1) 准备

   需要下载fabric ca serverfabric ca client的可执行文件,然后将其放到/opt/gopath/bin的路径下面。

   可以通过两种方式:

   1:自己编译:

    $ go get -u github.com/hyperledger/fabric-ca

   $ cd $GOPATH/src/github.com/hyperledger/fabric-ca

   $ make fabric-ca-server

   $ make fabric-ca-client

   $ ls bin/fabric-ca-client  fabric-ca-server

   2:直接下载

     go get -u github.com/hyperledger/fabric-ca/cmd/

(2) 启动server

      fabric-ca-server start -b admin:adminpw

     -b选项为引导管理员提供注册ID和密码; 如果LDAP未启用“ldap.enabled”设置,则这是必需的。如果服务器以前没有被初始化,它将在第一次启动时自行初始化。 在初始化期间,如果服务器尚不存在,服务器将生成ca-cert.pemca-key.pem文件,并且如果该文件不存在,还会创建一个默认配置文件。

   启动Fabric CA服务器至少需要一个引导程序标识; 这个身份是服务器管理员(admin:adminpw)。如果没有指定--ca.certfile和--ca.keyfile 参数,那么生成的证书和私钥是自签的。

   除非Fabric CA服务器配置为使用LDAP,否则必须至少配置一个预先注册的引导身份identity,以便您注册和注册其他身份identity -b选项指定引导身份的名称和密码。 

如果不想自签,使用自己准备的证书和**,可以通过下面三种方式进行指定。

    1:配置文件

     如果需要CSR的自定义值,则可以自定义配置文件,修改ca.certfile和ca.keyfile配置项指定的文件,然后再次运行fabric-ca-server init -b admin:adminpw命令。

    2:命令行

         fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/${PRIVATE_KEY} -b admin:adminpw -d

              Fabric CA Server启动的时候,带了3个重要的参数:ca.certfile 指定了CA的根证书,ca.keyfile 指定了接下来给新用户签发证书时的私钥。另外就是-b参数,指定了CA Client连接CA Server时使用的用户名密码。其中证书和**两个文件都必须是PEM编码的,并且不得加密。更具体地说,CA证书文件的内容必须以----- BEGIN CERTIFICATE -----开头,并且**文件的内容必须以----- BEGIN PRIVATE KEY -----开头,而不是-----开始加密私钥-----。

     3:镜像

             docker-compose.yaml文件中的 command: sh -c 'fabric-ca-server start -b admin:adminpw'命令行修改为 fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/${PRIVATE_KEY} -b admin:adminpw -d


(3) 启动client然后生成管理员的证书和私钥

  通过调用在7054端口本地运行的Fabric CA服务器来登录其标识为admin且密码为adminpw的标识。也是管理员身份。

     export FABRIC_CA_CLIENT_HOME=$HOME/ca

      fabric-ca-client enroll -u http://admin:[email protected]:7054

  登记命令,会在fabric CA 客户端的msp目录的子目录中存储注册证书(ECert),相应的私钥和CA证书链PEM文件。

   (openssl verify -CAfile localhost-7054.pem localhost-7054.pem验证是否是自签名证书:localhost-7054.pem: OK

(4) 用管理员身份签其他用户

    我们用该管理员身份去注册一个普通的user用户名为devun,属于org1.department1联盟:

 fabric-ca-client register --id.name devin --id.type user --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,foo=bar'

    2017/09/05 22:20:41 [INFO] User provided config file: /home/studyzy/ca/fabric-ca-client-config.yaml

    2017/09/05 22:20:41 [INFO] Configuration file location: /home/studyzy/ca/fabric-ca-client-config.yaml

    Password: GOuMzkcGgGzq

   我们拿到这个密码以后就可以再次使用enroll命令,给devin这个用户生msp的私钥和证书:

   fabric-ca-client enroll -u http://devin:[email protected]:7054 -M $FABRIC_CA_CLIENT_HOME/devinmsp

 现在新用户devin的私钥和证书就在$HOME/ca/devinmsp目录下,我们可以使用tree命令查看一下:

   devinmsp/

   ├── cacerts

   │   └── localhost-7054.pem

   ├── keystore

   │   └a044e43ad1fd7cdfd1fd995abaef53895534bd70e8cdfdb665430d12665f2041_sk

   └── signcerts

       └── cert.pem

  通常,MSP目录的cacerts目录必须包含其他证书颁发机构的证书颁发机构链,表示对等体的所有信任根。

  其中这些属性以hf开头的,是需要进行了解的,表示的是用户是否拥有相关的权限:

      hf.Registrar.Roles该用户可以增加的新用户类型,用户类型都有:clientordererpeeruser

      hf.Registrar.DelegateRoles该用户可以设置的新用户的hf.Registrar.Roles属性。

      hf.Registrar.Attributes该用户可以为新用户设置的保留属性和自定义属性。

      hf.GenCRL该用户是否可以获取CRL列表,已经撤销的证书列表。

      hf.Revoker该用户是否能够撤销其它用户。

      hf.AffiliationMgr该用户是否可以管理联盟。

      hf.IntermediateCA该用户是否可以作为中间CA。

      除了这些以hf.开头的属性外,还可以自定义属性,例如下面的admin=true:

(5) 查看联盟以及成员

      fabric-ca默认注册了几个联盟,可以用affiliation list查看:

      fabric-ca-client affiliation list

     affiliation: .

         affiliation: org1

         affiliation: org1.department1

         affiliation: org1.department2

         affiliation: org2

          affiliation: org2.department1

   添加/删除联盟成员,也是通过这个命令进行:

          fabric-ca-client affiliation add another

          fabric-ca-client affiliation remove another

          可以用fabric-ca-client identity list查看有权限查看的用户的详情

          fabric-ca-client identity list

     列出已经签的所有的实体

         并且进行删除以及修改实体用户。具体参考官方文档。

 三:升级

  在升级Fabric CA客户端之前,必须升级Fabric CA服务器 升级之前,建议备份当前数据库:

  要升级Fabric CA服务器的单个实例:

  停止fabric-ca-server进程。

     确保当前数据库已备份。

  将之前的fabric-ca-server二进制文件替换为升级版本。

  启动fabric-ca-server进程。

  使用以下命令验证fabric-ca-server进程是否可用,其中<host>是启动服务器的主机名:

     fabric-ca-client getcainfo -u http// <host>7054

  要使用MySQL或Postgres数据库升级fabric-ca-server实例的集群,请执行以下步骤。 我们假设您正在使用haproxy为host1和host2上的两个fabric-ca-server群集成员(分别在端口7054上侦听)负载均衡。完成此过程后,您将对升级的fabric-ca-server群集成员进行负载平衡 在host3和host4上分别监听端口7054。具体参考官方文档。 

四:参考文档

http://www.lijiaocn.com/%E9%A1%B9%E7%9B%AE/2018/04/27/hyperledger-fabric-ca-usage.html

https://www.cnblogs.com/studyzy/p/7482451.html

http://hyperledger-fabric-ca.readthedocs.io/en/latest/users-guide.html