参考
下图展示了Hyperledger Fabric CA服务器在整个Heyperledger Fabric架构中的定位:
有两种方式可以与Hyperledger Fabric CA服务器交互:
所有与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服务器的主目录按以下逻辑确定:
如果命令行存在-home选项,那么使用该选项值
refer
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-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
同时,可以查看生成的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-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 可以采用客户端命令行或 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-ca-client 命令可以与服务端进行交互, 包括五个子命令:
进入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 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 server将在注册过程中进行三个授权检查:
注册者的hf.Registrar.Roles属性值中必须包含要注册身份的类型。例如,如果 注册者的hf.Registrar.Roles属性值为peer,app,user,那么注册者可以注册peer、app 和user类型的身份,但是无法注册orderer类型的身份。
注册者的联盟必须与要注册身份的联盟(或其前缀)一致。例如,联盟a.b的注册者 可以注册联盟a.b.c的身份,但是不能注册联盟a.c的身份。如果身份要求根联盟,那么 联盟请求应当是.并且注册者必须属于根联盟。如果在注册请求中没有指定联盟,那么 注册中的身份将被赋予注册者的联盟。
如果以上条件都满足,注册者可以注册一个用户: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遵循如下规则:
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客户端将可以正确的处理先后顺序。