Fabric-CA

Fabric CA概述

参考

下图展示了Hyperledger Fabric CA服务器在整个Heyperledger Fabric架构中的定位:

Fabric-CA_第1张图片

有两种方式可以与Hyperledger Fabric CA服务器交互:

  • 使用Hyperledger Fabric CA客户端
  • 使用某种特定开发语言的Farbic SDK。

所有与Hyperledger Fabric CA服务器的通信都是 使用REST API。可以查看fabric-ca/swagger/swagger-fabric-ca.json文件以获得这些REST API的swagger文档。也可以在线访问http://editor2.swagger.io以查看文档。

Hyperledger Fabric CA客户端或SDK可能连接到Hyperledger Fabric CA服务器集群 中的一个服务器,这一点可以查看上图的右上部分。客户端将请求提交给HA代理访问 端结点,HA代理进行负载均衡,并将客户端的请求路由给fabric-ca-server集群中的 某一成员服务器。

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

一个服务器可能包含多个CA,每个CA可能是根CA或者中间CA。每个中间CA都有一个 父级CA,该父级CA要么是根CA,要么是中间CA。

Fabric CA服务器概述

可以在启动Fabric CA服务器之前先进行初始化。这让我们有机会 生成默认的配置文件,以便在启动服务器之前进行自定义调整。

Fabric CA服务器的主目录按以下逻辑确定:

如果命令行存在-home选项,那么使用该选项值

  • 否则,如果存在FABRIC_CA_SERVER_HOME环境变量,那么使用该环境变量值
  • 否则,如果存在FABRIC_CA_HOME环境变量,那么使用该环境变量值
  • 否则,如果存在CA_CFG_PATH环境变量,那么使用该环境变量值
  • 否则,使用当前工作目录

Fabric CA 启动和测试

refer

docker fabric-ca-server启动

cd $gopath/src/github.com/hyperledger/fabric-ca/docker/server
如果想要使用不同fabric-ca版本,修改docker-compose.yml

     image: hyperledger/fabric-ca
+   image: hyperledger/fabric-ca:1.4.6

执行

docker-compose up

docker启动日志

fabric-ca-server    | 2020/04/14 03:48:43 [INFO] Configuration file location: /etc/hyperledger/fabric-ca-server/fabric-ca-server-config.yaml
fabric-ca-server    | 2020/04/14 03:48:43 [INFO] Starting server in home directory: /etc/hyperledger/fabric-ca-server
fabric-ca-server    | 2020/04/14 03:48:43 [INFO] Server Version: 1.4.6
fabric-ca-server    | 2020/04/14 03:48:43 [INFO] Server Levels: &{Identity:2 Affiliation:1 Certificate:1 Credential:1 RAInfo:1 Nonce:1}
fabric-ca-server    | 2020/04/14 03:48:43 [INFO] The CA key and certificate already exist
fabric-ca-server    | 2020/04/14 03:48:43 [INFO] The key is stored by BCCSP provider 'SW'
fabric-ca-server    | 2020/04/14 03:48:43 [INFO] The certificate is at: /etc/hyperledger/fabric-ca-server/ca-cert.pem
fabric-ca-server    | 2020/04/14 03:48:43 [INFO] Initialized sqlite3 database at /etc/hyperledger/fabric-ca-server/fabric-ca-server.db
fabric-ca-server    | 2020/04/14 03:48:43 [INFO] The Idemix issuer public and secret key files already exist
fabric-ca-server    | 2020/04/14 03:48:43 [INFO]    secret key file location: /etc/hyperledger/fabric-ca-server/msp/keystore/IssuerSecretKey
fabric-ca-server    | 2020/04/14 03:48:43 [INFO]    public key file location: /etc/hyperledger/fabric-ca-server/IssuerPublicKey
fabric-ca-server    | 2020/04/14 03:48:43 [INFO] The Idemix issuer revocation public and secret key files already exist
fabric-ca-server    | 2020/04/14 03:48:43 [INFO]    private key file location: /etc/hyperledger/fabric-ca-server/msp/keystore/IssuerRevocationPrivateKey
fabric-ca-server    | 2020/04/14 03:48:43 [INFO]    public key file location: /etc/hyperledger/fabric-ca-server/IssuerRevocationPublicKey
fabric-ca-server    | 2020/04/14 03:48:44 [INFO] Home directory for default CA: /etc/hyperledger/fabric-ca-server
fabric-ca-server    | 2020/04/14 03:48:44 [INFO] Operation Server Listening on 127.0.0.1:9443
fabric-ca-server    | 2020/04/14 03:48:44 [INFO] Listening on http://0.0.0.0:7054

说明:

  • 服务器自动创建默认的配置文件fabric-ca-server-config.yaml
  • 服务器自动生成自签名证书ca-cert.pem和ca-key.pem文件
  • Fabric CA服务器将在端口7054监听
  • 生成sqlite3数据库fabric-ca-server.db
  • tls-cert.pem 无论fabric-ca-server-config.yaml中的tls.enable是否等于true,都会生成此文件,当tls.enable=true,客户端连接ca的时候必须带上tls-cert.pem,
    例如:
fabric-ca-client enroll -u https://admin:adminpw@localhost:7054 --caname glowd-
orderer-ca --tls.certfiles ${PWD}/tls-cert.pem

docker启动时,默认会执行

fabric-ca-server start -b admin:adminpw

表明:

进入docker ,可以查看默认Fabric CA服务器的主目录为 /etc/hyperledger/fabric-ca-server

docker exec -it 35cd0bf14a51 bash
root@35cd0bf14a51:/# echo $FABRIC_CA_HOME
/etc/hyperledger/fabric-ca-server
fabric-ca-server.db users表

同时,可以查看生成的sqlite3数据库fabric-ca-server.db里面有一个users表,表里面有一行数据
在这里插入图片描述
这是fabric-ca-server-config.yaml的下面的配置片段决定的

registry:
  # Maximum number of times a password/secret can be reused for enrollment
  # (default: -1, which means there is no limit)
  maxenrollments: -1

  # Contains identity information which is used when LDAP is disabled
  identities:
     - name: admin
       pass: adminpw
       type: client
       affiliation: ""
       attrs:
          hf.Registrar.Roles: "*"
          hf.Registrar.DelegateRoles: "*"
          hf.Revoker: true
          hf.IntermediateCA: true
          hf.GenCRL: true
          hf.Registrar.Attributes: "*"
          hf.AffiliationMgr: true

可以看出,此行表示

id: admin   # 用户id为admin
token:        # 用户enroll密码
type: client   # 用户类型,可选,client,peer,order
affiliation:   # 隶属于哪个联盟链组织
attributes: 
[{"name":"hf.Registrar.Attributes","value":"*"},{"name":"hf.AffiliationMgr","value":"1"},{"name":"hf.Registrar.Roles","value":"*"},{"name":"hf.Registrar.DelegateRoles","value":"*"},{"name":"hf.Revoker","value":"1"},{"name":"hf.IntermediateCA","value":"1"},{"name":"hf.GenCRL","value":"1"}]
state: 
max_enrollments: -1 #客户端enroll密码最多使用次数,- 1表示无限制 ; 0 表示使用 CA's max enrollment
level: 2  #未知 
incorrect_password_attempts: 0  # 最大错误密码尝试次数,0表示无限尝试

下表列出了可以用于身份注册的所有属性,属性的名称是大小写敏感的,如果是"*",表示全部拥有

名称 类型 描述
hf.Registrar.Roles List 注册者允许管理的角色列表,四个角色-peer,app,user,order
hf.Registrar.DelegateRoles List 注册者可以赋予被注册身份的hf.Registrar.Roles属性的角色列表
hf.Registrar.Attributes List 注册者允许注册的属性列表(即下面4个属性)
hf.GenCRL Boolean 要注册的身份是否可以生成CRL
hf.Revoker Boolean 要注册的身份是否可以回收证书
hf.AffiliationMgr Boolean 要注册的身份是否可以管理联盟
hf.IntermediateCA Boolean 要注册的身份是否可以登记中间CA
fabric-ca-server.db affiliation表, 隶属联盟表

Fabric-CA_第2张图片
这是fabric-ca-server-config.yaml的下面的配置片段决定的

affiliations:
   org1:
      - department1
      - department2
   org2:
      - department1

必须在表中有的联盟,才能在register时指定–id.affiliation org1.department1,否则会报" Failed to get Affiliation: sql: no rows in result set" 错误;
例如org1.department1.Team 也会报错,因为找不到Team的联盟配置

fabric-ca-client

fabric client 目录

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 作为客户端的主目录。

如果没有export FABRIC_CA_CLIENT_HOME,那么fabric-ca-client就会去找FABRIC_CA_HOME目录,也就是客户端生成的数据都会跑到server的目录中

fabric client 命令

fabric-ca-client 命令可以与服务端进行交互, 包括五个子命令:

  • enroll: 登记获取证书ECert
  • register:登记用户
  • getcainfo:获取CA服务的证书链
  • reenroll:重新注册
  • revoke:撤销签发的证书身份
  • version:Fabric-CA 客户端版本信息
    这些命令在执行时都是通过服务端的 RESTful 接口来进行操作的。

fabric-ca-client enroll

进入docker ,

docker exec -it 35cd0bf14a51 bash

$ mkdir -p /etc/hyperledger/fabric-ca-client/admin
$ export FABRIC_CA_CLIENT_HOME=/etc/hyperledger/fabric-ca-client/admin
$ fabric-ca-client enroll -u http://admin:adminpw@localhost:7054

日志

2020/04/17 07:36:49 [INFO] Created a default configuration file at /etc/hyperledger/fabric-ca-client/admin/fabric-ca-client-config.yaml
2020/04/17 07:36:49 [INFO] generating key: &{A:ecdsa S:256}
2020/04/17 07:36:49 [INFO] encoded CSR
2020/04/17 07:36:49 [INFO] Stored client certificate at /etc/hyperledger/fabric-ca-client/admin/msp/signcerts/cert.pem
2020/04/17 07:36:49 [INFO] Stored root CA certificate at /etc/hyperledger/fabric-ca-client/admin/msp/cacerts/localhost-7054.pem
2020/04/17 07:36:49 [INFO] Stored Issuer public key at /etc/hyperledger/fabric-ca-client/admin/msp/IssuerPublicKey
2020/04/17 07:36:49 [INFO] Stored Issuer revocation public key at /etc/hyperledger/fabric-ca-client/admin/msp/IssuerRevocationPublicKey

在/etc/hyperledger/fabric-ca-client/admin目录下面会生成

- fabric-ca-client-config.yaml  
- msp
  - IssuerPublicKey
  - cacerts    ## 每一个org都有一个独立的Root CA或者中间CA证书,所有基于glowd-org2-ca生成的,都是这个证书
	  - localhost-7054-glowd-org2-ca.pem
  - signcerts  ## 被keystore签名的Transactions 和 communications都会被此public key验证
  	  - cert.pem
  - IssuerRevocationPublicKey
  - keystore   ## Transactions 和 communications 都会被此 private key 签名
	 - 2c5b7161f5a951887919554052f0ce894e9306da2144d0448e4f869fe782a357_sk
  - user 
  • 客户端自动创建默认的配置文件fabric-ca-client-config.yaml,可以通过修改此配置文件修改CSR refer
  • 客户端证书使用256位ecdsa算法
  • 私钥 msp/keystore/38fa9d6943c9dd5ee06941b215f91825f5f9699a5c6ea9503a39d4b6a48d7e11_sk refer
  • 公钥cert.pem,服务端数据库的certificates表中会保存此证书,服务端可以验证私钥签名的数据 refer
  • 独立的Root CA或者中间CA证书localhost-7054.pem,每一个org都有一个独立的Root CA或者中间CA证书,所有基于此CA生成的cacert都是这个证书
  • 生成客户端零知识证明组件Idemix(Identity Mixer)的IssuerPublicKey和IssuerRevocationPublicKey refer

当客户端执行完了fabric-ca-client enroll -u http://admin:adminpw@localhost:7054之后,会在fabric-ca-server的数据库的certificates表中插入一条数据
在这里插入图片描述

id: admin       # 用户id
serial_number: 319a43b31df518726303709400551a8be3ec9c9c  #证书id
authority_key_identifier: 26656bcad5fb8bfd47f0a81639328cd15224e1f1 #权限key,同一个用户多次登记,值不变
ca_label:
status: good  # 当前状态好
reason: 0   
expiry: 2021-04-17 09:47:00+00:00  # 过期时间,1年
revoked_at:
pem:
-----BEGIN CERTIFICATE-----
MIICPzCCAeagAwIBAgIUMZpDsx31GHJjA3CUAFUai+PsnJwwCgYIKoZIzj0EAwIw
aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK
EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt
Y2Etc2VydmVyMB4XDTIwMDQxNzA5NDIwMFoXDTIxMDQxNzA5NDcwMFowXTELMAkG
A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl
cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqG
SM49AgEGCCqGSM49AwEHA0IABOMJp6m6NS74fNQMce5CkG7CrB6PossKBp4C8Y9V
hXGJqNS0jDvgNJBXBhgAPhpHQIym/QNHa/82GJ0G1LqwqyqjeTB3MA4GA1UdDwEB
/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQHWuJw+wPlcdaW+4NgyHem
N/SOTDAfBgNVHSMEGDAWgBQmZWvK1fuL/UfwqBY5MozRUiTh8TAXBgNVHREEEDAO
ggwzNWNkMGJmMTRhNTEwCgYIKoZIzj0EAwIDRwAwRAIgUawDVUCU6N25Ql169+cH
R5Xm3znSOEfGyOcygyOf0ewCIEZWzha4fXEklZnvtn0kAdY00VS2K4zbKYmIWQm7
pnZ8
-----END CERTIFICATE-----  #ECert:Enrollment Certificate 客户端获取的登记证书,对应客户端路径msp/signcerts/cert.pem
level: 1

fabric-ca-client register

执行注册请求的身份必须已经登记过,并且还需要适当的权限来登记指定的身份类型。

另外,Fabric CA server将在注册过程中进行三个授权检查:

  1. 注册者的hf.Registrar.Roles属性值中必须包含要注册身份的类型。例如,如果 注册者的hf.Registrar.Roles属性值为peer,app,user,那么注册者可以注册peer、app 和user类型的身份,但是无法注册orderer类型的身份。

  2. 注册者的联盟必须与要注册身份的联盟(或其前缀)一致。例如,联盟a.b的注册者 可以注册联盟a.b.c的身份,但是不能注册联盟a.c的身份。如果身份要求根联盟,那么 联盟请求应当是.并且注册者必须属于根联盟。如果在注册请求中没有指定联盟,那么 注册中的身份将被赋予注册者的联盟。

  3. 如果以上条件都满足,注册者可以注册一个用户:TODO

下表列出了可以用于身份注册的所有属性,属性的名称是大小写敏感的,如果是"*",表示全部拥有

名称 类型 描述
hf.Registrar.Roles List 注册者允许管理的角色列表,四个角色-peer,app,user,order
hf.Registrar.DelegateRoles List 注册者可以赋予被注册身份的hf.Registrar.Roles属性的角色列表
hf.Registrar.Attributes List 注册者允许注册的属性列表(即下面4个属性)
hf.GenCRL Boolean 要注册的身份是否可以生成CRL
hf.Revoker Boolean 要注册的身份是否可以回收证书
hf.AffiliationMgr Boolean 要注册的身份是否可以管理联盟
hf.IntermediateCA Boolean 要注册的身份是否可以登记中间CA

下面的命令以admin的身份,注册一个新的用户admin2,并设置其联盟为org1.department1, hf.Revoker为true:

fabric-ca-client register --id.name admin2 --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,admin=true:ecert'
2020/04/22 13:06:11 [INFO] Configuration file location: /etc/hyperledger/fabric-ca-client/admin/fabric-ca-client-config.yaml
Password: iXqqOUmpmAhU

此密码用于fabric-ca-client enroll

可以使用-id.attrs标志设置多个属性,例如:

fabric-ca-client register -d --id.name admin2 --id.affiliation org1.department1 --id.attrs '"hf.Registrar.Roles=peer,user",hf.Revoker=true'

或者:

fabric-ca-client register -d --id.name admin2 --id.affiliation org1.department1 --id.attrs '"hf.Registrar.Roles=peer,user"' --id.attrs hf.Revoker=true

下面的命令注册一个peer节点身份:

fabric-ca-client register --id.name peer1 --id.type peer --id.affiliation org1.department1 --id.secret peer1pw

登记对等节点身份

现在已经成功注册了一个对等节点身份,那么可以使用ID和密码来登记其身份。 这类似于登记启动身份。

下面的命令登记peer1。注意要替换-M选项的值为你的对等节点MSP目录,这对应于 对等节点的core.yaml文件中的mspConfigPath配置。你也可以设置FABRIC_CA_CLIENT_HOME 为你的节点的主目录。

fabric-ca-client enroll -u http://peer1:peer1pw@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/msp

登记一个排序节点身份也是一样的,除了MSP目录要设置为orderere.yaml中的 LocalMSPDir设置。

所有由fabric-ca-server签发的登记证书,其OU遵循如下规则:

  • OU层级的根与身份类型一致
  • OU添加到身份联盟中
    例如,如果一个属于联盟department.team1的peer类型的身份,身份的OU层级是 OU=team1, OU=department1,OU=peer

获取CA证书链

MSP目录下的cacerts目录,必须包含其他CA机构的证书,以便构造用户证书验证链。

fabric-ca-client getcainfo命令可以用来从其他Fabric CA服务器实例提取这些 证书链。

例如,下面的命令将启动第二个Fabric CA服务器,在本机监听7055端口,名为CA2。 这这表示一个完全隔离的信任根,可以有区块链上的不同成员管理:

export FABRIC_CA_SERVER_HOME=$HOME/ca2
fabric-ca-server start -b admin:ca2pw -p 7055 -n CA2

下面的命令将在peer1的MSP目录安装CA2的证书链:

root@35cd0bf14a51:/etc/hyperledger/fabric-ca-client/admin# fabric-ca-client getcainfo -u http://localhost:7054 -M msp
2020/04/25 15:47:35 [INFO] Configuration file location: /etc/hyperledger/fabric-ca-client/admin/fabric-ca-client-config.yaml
2020/04/25 15:47:35 [INFO] Stored root CA certificate at /etc/hyperledger/fabric-ca-client/admin/msp/cacerts/localhost-7054.pem #服务端root证书
2020/04/25 15:47:35 [INFO] Stored Issuer public key at /etc/hyperledger/fabric-ca-client/admin/msp/IssuerPublicKey #零知识证明
2020/04/25 15:47:35 [INFO] Stored Issuer revocation public key at /etc/hyperledger/fabric-ca-client/admin/msp/IssuerRevocationPublicKey #零知识证明

默认情况下,Fabric CA服务器按子节点优先的顺序返回CA链。这意味着链中 的每个CA证书之后都是其签发CA的证书。如果需要Fabric CA服务器以相反顺序 返回证书链,可以设置环境变量CA_CHAIN_PARENT_FIRST为true,然后重新启动 Fabric CA服务器。Fabric CA客户端将可以正确的处理先后顺序。

你可能感兴趣的:(加密解密,fabric,区块链)