Fabric—Ca的概念不再解释了,这里只说明使用方法:

前置条件

  • Go语言1.10+版本
  • GOPATH环境变量正确设置
  • 已安装libtoollibtdhl-dev

Ubuntu系统

通过以下命令安装libtoollibtdhl-dev包:

sudo apt install libtool libltdl-dev

MacOs 系统

Mac系统通过以下命令安装:

brew install libtool

Fabric-Ca安装

可以通过以下两种途径进行安装:

  1. 直接下载二进制文件:
    go get -u github.com/hyperledger/fabric-ca/cmd/...
    如果使用这种方式安装,安装成功的话直接在命令行输入(前提是GOPATH正确配置):
    fabric-ca-server version
    即可打印出安装的Ca版本。
  2. 从源码编译安装:
    首先在系统中建立以下路径:
    mkdir -p $GOPATH/src/github.com/hyperledger/
    cd $GOPATH/src/github.com/hyperledger/
    从Github上面将Fabric-Ca仓库克隆到本地:
    git clone https://github.com/hyperledger/fabric-ca.git
    cd fabric-ca
    进行源码编译:
    make fabric-ca-server
    make fabric-ca-client
    如果没有报错的话,当前文件下会编译出一个bin文件夹,最后一步将该文件夹添加到环境变量,安装完成!

编译Ca的Docker镜像

直接在fabric-ca文件夹内执行以下命令:

make docker

Fabric-Ca服务器简单使用


设置Fabric Ca服务器的Home文件夹

启动Fabric Ca 服务器的第一步是需要对Fabric Ca服务器进行初始化操作,初始化操作将会生成一些默认的配置文件,所以我们首先需要指定一个文件夹作为服务器的主文件夹用来放生成的配置文件。
可以通过以下几种方式设置Fabric-Ca服务器的主文件夹,优先级由高到低排序:

  1. 通过命令行设置参数--home设置。
  2. 如果设置了FABRIC_CA_SERVER_HOME环境变量,则使用该环境变量作为主文件夹。
  3. 如果设置了FABRIC_CA_HOME环境变量,则使用该环境变量作为主文件夹。
  4. 如果设置了CA_CFG_PATH环境变量,则使用该环境变量作为主文件夹。
  5. 如果以上方法都没有设置,则将当前工作目录作为主文件夹。

官方建议是通过设置FABRIC_CA_HOME$HOME/fabric-ca/server作为服务器的主文件夹。

初始化服务器

上一步骤完成后,就可以对Fabric Ca进行初始化了,执行以下命令:

fabric-ca-server init -b admin:adminpw

通过-b参数指定管理员的账号和密码对服务器进行初始化。将会生成一个自签名的证书。

  • admin:相当于管理员账号
  • adminpw:相当于管理员密码

admin:adminpw可以自行设置。
或者服务器的初始化也可以通过-u参数指定服务器的上一级服务器,也就是父服务器。格式为:-u <parent-fabric-ca-server-URL,其中这里的URL必须使用<协议>://<enrollmentId>:<secret>@<host>:<port>的格式。
初始化之后将会生成几个文件:

IssuerPublicKey      #与零知识证明相关文件,暂不解释
IssuerRevocationPublicKey #与零知识证明相关文件,暂不解释
ca-cert.pem             #CA服务器的根证书文件,只有持有该证书,用户才可以进行证书的颁发
fabric-ca-server-config.yaml   #默认配置文件,对Ca服务器进行配置时可以用到
fabric-ca-server.db  #Ca服务器数据库,存储注册的用户,组织,证书等信息。可以通过sqlite3 命令进去查看
msp/

启动服务器

初始化之后可以直接启动服务器:

fabric-ca-server start -b <admin>:<adminpw>

服务器将会监听在7054端口。如果需要服务器监听在https上而不是http上,需要将tls.enabled设置为true

启动完之后,即可以通过fabric-ca-client工具或者是SDK对Ca服务器进行操作了。

Fabric Ca 客户端

这一部分说明命令行工具fabric-ca-client的简单使用。

设置Fabric Ca客户端的Home文件夹

与服务器相同,客户端也具有自己的主文件夹,用来保存客户端的证书秘钥等等。
可以通过以下几种方式设置Fabric-Ca客户端的主文件夹,优先级由高到低排序:

  1. 通过命令行设置参数--home设置。
  2. 如果设置了FABRIC_CA_CLIENT_HOME环境变量,则使用该环境变量作为主文件夹。
  3. 如果设置了FABRIC_CA_HOME环境变量,则使用该环境变量作为主文件夹。
  4. 如果设置了CA_CFG_PATH环境变量,则使用该环境变量作为主文件夹。
  5. 如果以上方法都没有设置,则$HOME/.fabric-ca-client将作为主文件夹。

官方例子:export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin

用户登陆

设置完之后,我们使用命令行工具登陆管理员用户:

fabric-ca-client enroll -u http://admin:adminpw@localhost:7054

admin目录下会产生以下文件:

.
├── fabric-ca-client-config.yaml
└── msp
    ├── IssuerPublicKey
    ├── IssuerRevocationPublicKey
    ├── cacerts
    │   └── localhost-7054.pem     #CA服务器的根证书,只不过换了一个名字
    ├── keystore
    │   └── 7ec84cbc25c20600ba98bf2bafb9c695ad57e392a57fb9f33b51fc493601a432_sk  #当前用户的秘钥信息
    ├── signcerts
    │   └── cert.pem   #当前用户的证书
    └── user

注册一个身份

通过Fabric-CA注册新的身份时,将由Fabric-CA服务器进行三个部分的权限检查确定当前用户是否具有权限进行身份的注册。

  1. 注册者必须含有hf.Registrar.Roles属性,并且需要注册的身份类型必须在该属性对应的值的列表中存在。比如注册者的hf.Registrar.Roles属性中对应的值只有一个peer,那么注册者使能注册类型为peer的身份,而不能注册client,admin,orderer.如果注册者的hf.Registrar.Roles属性对应的值为*,则说明可以注册任何类型的身份。
  2. 简单说就是上下级关系,比如注册者所处的部门为a.b,那么他只能注册处于a.b以及a.b.*部门的身份,而不能注册处于a.c部门的身份。如果需要注册一个最上级的部门的身份,那么需要将需要将需要注册的身份的hf.affiliation指定为.,并且注册者所处的部门也需要是最上级的部门。如果在注册身份时没有指定所属的部门,则默认被注册的身份所处的部门与注册者部门相同。
  3. 如果注册者满足以下条件则可以注册带有属性的身份:
    • 对于Fabric CA中的保留属性(前缀以hf开头的):只有注册者具有这个属性并且是hf.Registrar.Attributes属性中的值得一部分。也就是说如果需要注册一个带有hf.a属性的身份,那么注册者自己也需要有这个属性,并且在注册者的hf.Registrar.Attributes属性对应的值中需要包含hf.a这个属性。并且hf.a这个属性的值是一个列表,那么被注册的身份具有的hf.a属性只能等于或者等于列表中的一个子集。另外,如果hf.a这个属性的值对应的是一个布尔值,那么需要注册者hf.a属性的值为true
    • 对于注册者自定义的属性(不是Fabric Ca中的保留属性):注册者hf.Registrar.Attributes对应的值需要包括这个属性,或者是已经注册过的模式。唯一支持的模式是以*结尾的字符串。比如注册者hf.Registar.Attributes对应的值为a.b.*,那么他可以注册的属性需要以a.b.开头。如果注册者hf.Registar.Attributes对应的值为orgAdmin,那么注册者只可以对一个身份进行添加或者删除orgAdmin属性.
    • 对于hr.Registrar.Attributes属性:一个额外的检查是该属性对应的值需要等于注册者具有的该属性对应的值,或者是注册者具有的该属性对应的值的子集。

接下来使用admin的身份注册一个身份:

  • enrollment idadmin2
  • 部门为org1.department1
  • 属性名字为hf.Revoker,对应的值为true
  • 属性名字为admin,对应的值为true
export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register \
    --id.name admin2     \
    --id.affiliation org1.department1 \
    --id.attrs 'hf.Revoker=true,admin=true:ecert'

其中对于属性admin=true,后缀为ecert表示这条属性将会添加到证书中,可以用来进行做访问控制的决定。

对于多个属性,可以使用--id.attrs参数标记,并使用单引号括起来,每个属性使用逗号分隔开:

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

或者是:

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

或者是通过客户端配置文件fabric-ca-client-config.yaml

id:
  name:
  type: client
  affiliation: org1.department1
  maxenrollments: -1
  attributes:
    - name: hf.Revoker
      value: true
    - name: anotherAttrName
      value: anotherAttrValue

接下来的命令是通过以上的配置文件注册一个身份:

  • enrollment idadmin3
  • 身份类型为client
  • 部门为org1.department1
  • 属性名字为hf.Revoker,对应的值为true
  • 属性名字为anotherAttrName,对应的值为anotherAttrValue

设置maxenrollments为0或者是不设置将导致该身份可以使用CA的最大enrollment次数。并且一个身份的maxenrollments不能超过CAenrollments最大值。例如,如果CAenrollment最大值为5,则任何新的身份必须含有一个小于等于5的值。并且也不能设置为-1(-1表示无限制).

接下来注册一个peer类型的身份。在这里我们选择自定义的密码而不是由服务器自动生成:

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register \
    --id.name peer1 \
    --id.type peer \
    --id.affiliation org1.department1 \
    --id.secret peer1pw

注意,部门信息区分大小写,但服务器配置文件中指定的非叶子部门关系始终以小写形式存储。 例如,如果服务器配置文件的部门关系部分如下所示:

affiliations:
  BU1:
    Department1:
      - Team1
  BU2:
    - Department2
    - Department3

BU1,Department1,BU2使用小写进行存储。这是因为Fabric CA使用Viper读取配置。Viper对于大小写不敏感,如果需要注册一个身份部门为Team1,则需要通过--id.affiliation参数这样配置:bu1.department1.Team1

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client register \
    --id.name client1 \
    --id.type client \
    --id.affiliation bu1.department1.Team1

登录一个peer身份的用户

之前已经成功注册了一个peer身份的用户,可以通过指定idsecret进行登录,与之前不同的是需要通过-M参数指定Hyperledger Fabric MSP(成员关系服务提供者)文件夹结构。

接下来的命令将会登录peer1,确保使用-M参数指定了peer的MSP文件夹路径,该路径也是peercore.yaml文件内mspConfigPath参数的设置值。或者也可以通过环境变量FABRIC_CA_CLIENT_HOME指定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

登录一个orderer也是相同的,除了MSP文件夹是在ordererorderer.yaml文件中通过参数LocalMSPDir进行设置。

fabric-ca-server颁发的所有注册证书均具有以下组织单位(或简称为“ OU”):

  1. OU层次结构的根等于身份类型。
  2. OU被添加到身份部门关系的每个组成部分。

例如,如果一个身份类型为peer,部门为department.team1,则身份的OU分层(从根部开始):OU=team1,OU=department1,OU=peer.

获取身份混合器证书

获取身份混合器证书撤销信息

重新登录一个身份

假如你的登录证书过期了或者被恶意操作,需要通过以下命令重新创建一个登录证书:

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
fabric-ca-client reenroll

撤销一个证书或者身份

身份或者证书是可以被撤销的。撤销一个身份将会撤销所有属于这个身份的证书同时也会阻止该身份去获取新的证书。撤销一个证书只会使单个证书无效。

为了撤销一个证书或者是身份。撤销者必须含有hf.Revokerhf.Registrar.Roles两个属性。撤销一个身份只可以撤销从属于自己下级或者相同级别部门的证书或者是身份。进一步,撤销者只能撤销在撤销者hf.Registrar.Roles属性列表中存在的身份类型的身份。

例如,部门为orgs.org1并且hf.Registrar.Roles=peer,client的撤销者可以撤销从属于orgs.org1部门或者是orgs.org1.department1并且身份类型为peer或者是client的身份。不能撤销从属于orgs.org2部门或者是其他类型的身份。

下面的命令将会使一个身份与该身份下的所有证书失效,该身份未来对fabric CA服务器的所有请求将会被拒绝。

fabric-ca-client revoke -e <enrollment_id> -r <reason>

下面是-r参数支持的具体的原因:

  1. unspecified
  2. keycompromise
  3. cacompromise
  4. affiliationchange
  5. superseded
  6. cessationofoperation
  7. certificatehold
  8. removefromcrl
  9. privilegewithdrawn
  10. aacompromise

例如,引导启动的admin属于部门的最上级可以撤销peer1的身份信息:

export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
fabric-ca-client revoke -e peer1

属于一个身份的登录证书可以通过具体的AKI(权限密钥标识符)和序列号进行撤销:

fabric-ca-client revoke -a xxx -s yyy -r <reason>

例如,可以通过使用openssl命令获取一个证书的AKI和序列号并通过revoke命令撤销证书:

serial=$(openssl x509 -in userecert.pem -serial -noout | cut -d "=" -f 2)
aki=$(openssl x509 -in userecert.pem -text | awk '/keyid/ {gsub(/ *keyid:|:/,"",$1);print tolower($0)}')
fabric-ca-client revoke -s $serial -a $aki -r affiliationchange

--gencrl参数可以用来生成CRL(证书撤销列表),CRL包含所有被撤销的证书。例如,以下命令可以撤销peer1的身份。生成一个CRL并存储到<msp 文件夹>/crls/crl.pem文件。

fabric-ca-client revoke -e peer1 --gencrl

CRL可以使用gencrl命令生成,参考生成CRL部分获取关于gencrl命令的更多信息。

生成CRL(证书撤销列表)

通过Fabric CA SERVER撤销一个证书后,在Hyperledger Fabric中合适的MSP文件需要进行更新。包括本地的peer节点的MSP与合适的通道配置区块中的MSP.为了做到这一点,PEM编码的CRL需要放置到MSP文件夹内的crls文件夹。fabric-ca-client gencrl命令可以生成CRL。任何带有hf.GenCRL属性的身份都可以生成包含所有在一个确定的时间被撤销的证书的序列号的CRL。生成的CRL存储在<msp 文件夹>/crls/crl.pem文件。

以下的命令将会创建包含所有被撤销的(超时和未超时)证书的CRL存储在<msp 文件夹>/crls/crl.pem文件。

export FABRIC_CA_CLIENT_HOME=~/clientconfig
fabric-ca-client gencrl -M ~/msp

开启TLS

这一部分描述如何为Fabric CA客户端配置TLS的更多细节。

以下部分可以在fabric-ca-client-config.yaml文件中进行配置:

tls:
  enabled: true
  certfiles:
    - root.pem
  client:
    certfile: tls_client-cert.pem
    keyfile: tls_client-key.pem

certfiles选项设置为被客户端信任的根证书。典型的就是Fabric CA根服务器的证书,ca-cert.pem可以在服务器的主目录发现.

client选项要求只能手动在服务器进行TLS配置。

基于属性的访问控制

…未完待续



fabric-ca应用      fabric-ca

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!