HyperLedger Fabric中Fabric-CA的使用

一、简介
在e2e_cli的例子中,所有用到的证书和私钥都是由cryptogen这个工具根据crypto-config.yaml而生成的。但是在实际的生产环境中,我们需要给每个org都建立自己的CA,用来管理本org的用户。本次是以e2e_cli为例子,然后手动的生成所有的证书和私钥,并进行手动的执行例子进行验证。本次实验只部署了一个Fabric-CA作为rootCA。

二、环境准备

1.Linux环境(Cendos7)
go版本:1.11.5
Libtool和libtdhl-dev需要安装:yum install libtool libltdl-dev
2.可以成功跑通e2e_cli例子,这是基础。
3.安装fabric-ca-server和fabric-ca-client的可执行文件到$GOPATH/bin目录下.

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

该命令执行完毕后,我们应该在~/go/bin下面看到生成的2个文件:
fabric-ca-client fabric-ca-server
方便fabric-ca-server的启动。需要添加环境变量:

	vim /etc/profile

	export PATH=/opt/gopath/bin:$PATH

	export FABRIC_CA_CLIENT_HOME=/opt/gopath/bin/fabric-ca-files/admin
	
	source /etc/profile

三、生成根CA的证书
生成自签CA证书有两种形式:通过可执行文件和镜像,下面进行分别的说明:

1:命令行形式(我使用命令行形式)

执行

	fabric-ca-server start -b admin:adminpw

如果有删除联盟和删除用户的需求,需要用下面的方式启动:

	fabric-ca-server start -b admin:adminpw 	--cfg.affiliations.allowremove --cfg.identities.allowremove &

-b选项为引导管理员提供注册ID和密码; 如果服务器以前没有被初始化init,它将在第一次启动时自行初始化。 在初始化期间,如果服务器尚不存在,服务器将生成ca-cert.pem和ca-key.pem文件(msp文件夹下),并且如果该文件不存在,还会创建一个默认配置文件fabric-ca-server-config.yaml。

注意:
(1):首先可以通过fabric-ca-server init进行初始化,创建证书和私钥以及配置文件,也可以直接进行start,第一次start时会自动执行init的操作。
(2):这种操作产生的根证书是自签的。可以进行验证:(openssl verify -CAfile ca-cert.pem ca-cert.pem 返回ok)
(3):证书可以通过openssl x509 -in ca-cert.pem -text进行查看。

2:使用镜像启动

1、进入到$GOPATH/src/github.com/hyperledger/fabric-ca/docker/server目录下然后对docker-compose.yaml文件进行编辑。

fabric-ca-server:
   image: hyperledger/fabric-ca
   container_name: fabric-ca-server
   ports:
     - "7054:7054"
   environment:
     - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
   volumes:
     - "./fabric-ca-server:/etc/hyperledger/fabric-ca-server"
   command: sh -c 'fabric-ca-server start -b admin:adminpw'

2、然后执行 docker-compose up -d 启动容器。
( fabric-ca docker 镜像包含了fabric-ca-server和fabric-ca-client两部分。然后会在该目录下生成自签的CA证书和密钥以及fabric ca server的配置文件。)

如果不想自签,使用自己准备的证书和密钥,可以通过下面三种方式进行指定。(本次实验使用自签)
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

四、对应e2e_cli生成对应的证书

1:结构分析
HyperLedger Fabric中Fabric-CA的使用_第1张图片
这里做了简化,只部署了一个Fabric-CA作为rootCA。

将创建一个由两个组织org1.example.com和org2.example.com组成的的联盟。
另外还有一个组织example.com用来部署orderer。
example.com部署了一个solo模式的orderer。(多个orderer的部署方式,以后探讨)
orderer.example.com
org1.example.com部署了两个peer:
peer0.org1.example.com
peer1.org1.example.com
org2.example.com部署了两个peer:
peer0.org2.example.com
Peer1.org2.example.com
每个组织都要有一个Admin用户,每个组件(peer/orderer)也需要一个账号,因此需要通过fabric-ca创建8个用户:
example.com: [email protected] orderer.example.com
org1.example.com: [email protected] peer0.org1.example.com peer1.org1.example.com
org2.example.com: [email protected] peer0.org2.example.com peer1.org2.example.com
这里只创建了Admin用户,普通用户的创建方式相同,只是普通用户的证书不需要添加到目标组件的admincerts目录中。

2: 生成fabric-ca admin的凭证
在/opt/gopath/bin下面执行:mkdir fabric-ca-files 生成fabric-ca admin的凭证,用-H参数指定client目录:

mkdir -p `pwd`/fabric-ca-files/admin

fabric-ca-client enroll -u http://admin:adminpw@localhost:7054 -H `pwd`/fabric-ca-files/admin

这时候/opt/gopath/bin/fabric-ca-files下面有一个admin的文件夹(里面是管理员的证书和私钥等信息):

HyperLedger Fabric中Fabric-CA的使用_第2张图片
3:创建联盟

通过上面启动后,默认创建两个组织。
执行

fabric-ca-client  -H `pwd`/fabric-ca-files/admin  affiliation list

HyperLedger Fabric中Fabric-CA的使用_第3张图片
(这是fabric-ca-server配置文件中默认的配置,可以在配置文件上进行修改)

但是通过我们的结构分析,这种联盟以及名称不是我们需要的,我们需要进行修改。首先将其删除:(启动时必须指定cfg.affiliations)

fabric-ca-client -H `pwd`/fabric-ca-files/admin  affiliation remove --force  org1
fabric-ca-client -H `pwd`/fabric-ca-files/admin  affiliation remove --force  org2

然后创建我们需要的联盟:

fabric-ca-client  -H `pwd`/fabric-ca-files/admin  affiliation add com
fabric-ca-client  -H `pwd`/fabric-ca-files/admin  affiliation add com.example
fabric-ca-client  -H `pwd`/fabric-ca-files/admin  affiliation add com.example.org1
fabric-ca-client  -H `pwd`/fabric-ca-files/admin  affiliation add com.example.org2

创建联盟如下:

fabric-ca-client  -H `pwd`/fabric-ca-files/admin  affiliation list

在这里插入图片描述

4:为每个联盟创建msp,将根证书放入到对应的位置

mkdir -p ./fabric-ca-files/example.com/msp
fabric-ca-client getcacert -M `pwd`/fabric-ca-files/example.com/msp    //-M需要指定绝对路径

命令执行结束后,会在fabric-ca-files/example.com/msp得到文件:
注意:getcacert得到msp目录中只有CA证书。这里是用getcacert为每个组织准备需要的ca文件,在生成创始块的时候会用到!在1.1.0版本的fabric-ca中,只会生成组件或用户在操作区块链的时候用到的证书和密钥,不会生成用来加密grpc通信的证书。这里继续沿用之前的fabric网络中的tls证书,在最后的重新部署操作,只会替换msp目录。

用同样的方式分别为org1和org2进行操作:

mkdir -p fabric-ca-files/org1.example.com/msp
fabric-ca-client getcacert -M `pwd`/fabric-ca-files/org1.example.com/msp
mkdir -p ./fabric-ca-files/org2.example.com/msp
fabric-ca-client getcacert -M `pwd`/fabric-ca-files/org2.example.com/msp

tls在配置文件中设置为false不需要了。

5:注册example.com的管理员[email protected]

注册

fabric-ca-client register -H `pwd`/fabric-ca-files/admin  --id.name [email protected] --id.type client --id.affiliation "com.example" --id.attrs '"hf.Registrar.Roles=client,orderer,peer,user","hf.Registrar.DelegateRoles=client,orderer,peer,user",hf.Registrar.Attributes=*,hf.GenCRL=true,hf.Revoker=true,hf.AffiliationMgr=true,hf.IntermediateCA=true,role=admin:ecert'  --id.secret=password


fabric-ca-client enroll -u http://[email protected]:password@localhost:7054 -H `pwd`/fabric-ca-files/example.com/admin

验证身份是否可用:

fabric-ca-client affiliation list -H `pwd`/fabric-ca-files/example.com/admin

在这里插入图片描述

最后需要将[email protected]的证书复制到example.com/msp/admincerts/。只有这样,才能具备管理员权限。

mkdir fabric-ca-files/example.com/msp/admincerts/

cp fabric-ca-files/example.com/admin/msp/signcerts/cert.pem  fabric-ca-files/example.com/msp/admincerts/

6: 注册org1.example.com的管理员[email protected]

注册

fabric-ca-client register -H `pwd`/fabric-ca-files/admin --id.name [email protected] --id.type client --id.affiliation "com.example.org1" --id.attrs '"hf.Registrar.Roles=client,orderer,peer,user","hf.Registrar.DelegateRoles=client,orderer,peer,user",hf.Registrar.Attributes=*,hf.GenCRL=true,hf.Revoker=true,hf.AffiliationMgr=true,hf.IntermediateCA=true,role=admin:ecert'  --id.secret=password


fabric-ca-client enroll -u http://[email protected]:password@localhost:7054  -H `pwd`/fabric-ca-files/org1.example.com/admin

验证身份是否可用:

fabric-ca-client affiliation list -H `pwd`/fabric-ca-files/org1.example.com/admin

注意与[email protected]的区别,这里只能看到组织com.example.org1。

添加管理员权限

mkdir fabric-ca-files/org1.example.com/msp/admincerts/

cp fabric-ca-files/org1.example.com/admin/msp/signcerts/cert.pem  fabric-ca-files/org1.example.com/msp/admincerts/

[email protected]中也需要创建msp/admincerts目录,通过peer命令操作fabric的时候会要求admincerts存在:

mkdir fabric-ca-files/org1.example.com/admin/msp/admincerts/

cp fabric-ca-files/org1.example.com/admin/msp/signcerts/cert.pem fabric-ca-files/org1.example.com/admin/msp/admincerts/

7:注册org2.example.com的管理员[email protected]

注册

fabric-ca-client register -H `pwd`/fabric-ca-files/admin --id.name [email protected] --id.type client --id.affiliation "com.example.org2" --id.attrs '"hf.Registrar.Roles=client,orderer,peer,user","hf.Registrar.DelegateRoles=client,orderer,peer,user",hf.Registrar.Attributes=*,hf.GenCRL=true,hf.Revoker=true,hf.AffiliationMgr=true,hf.IntermediateCA=true,role=admin:ecert' --id.secret=password


fabric-ca-client enroll -u http://[email protected]:password@localhost:7054  -H `pwd`/fabric-ca-files/org2.example.com/admin

[email protected]只能看到组织com.example.org2。

fabric-ca-client affiliation list -H `pwd`/fabric-ca-files/org2.example.com/admin

添加管理员权限

mkdir fabric-ca-files/org2.example.com/msp/admincerts/

cp fabric-ca-files/org2.example.com/admin/msp/signcerts/cert.pem fabric-ca-files/org2.example.com/msp/admincerts/

mkdir fabric-ca-files/org2.example.com/admin/msp/admincerts/

cp fabric-ca-files/org2.example.com/admin/msp/signcerts/cert.pem fabric-ca-files/org2.example.com/admin/msp/admincerts/

8:各个组织分别使用自己的Admin账户创建其它账号

example.com、org1.example.com、org2.example.com三个组织这时候可以分别使用自己的admin账号创建子账号。

创建orderer.example.com
使用[email protected]注册账号orderer.example.com。注意这时候指定的目录是fabric-ca-files/example.com/admin/。

fabric-ca-client register -H `pwd`/fabric-ca-files/example.com/admin --id.secret=password  --id.name orderer.example.com --id.type orderer --id.affiliation "com.example" --id.maxenrollments "0" --id.attrs 'role=orderer:ecert'  --id.secret=password

fabric-ca-client enroll -u http://orderer.example.com:password@localhost:7054 -H `pwd`/fabric-ca-files/example.com/orderer

[email protected]的证书复制到fabric-ca-files/example.com/orderer/msp/admincerts:

mkdir fabric-ca-files/example.com/orderer/msp/admincerts

cp fabric-ca-files/example.com/admin/msp/signcerts/cert.pem fabric-ca-files/example.com/orderer/msp/admincerts/

创建peer0.org1.example.com
使用[email protected]注册账号peer0.org1.example.com。这时候指定的目录是fabric-ca-files/org1.example.com/admin/。

fabric-ca-client register -H `pwd`/fabric-ca-files/org1.example.com/admin/ --id.secret=password  --id.name peer0.org1.example.com --id.type peer --id.affiliation "com.example.org1" --id.maxenrollments "0" --id.attrs 'role=peer:ecert' --id.secret=password

fabric-ca-client enroll -u http://peer0.org1.example.com:password@localhost:7054 -H `pwd`/fabric-ca-files/org1.example.com/peer0

[email protected]的证书复制到fabric-ca-files/org1.example.com/peer0/msp/admincerts

mkdir fabric-ca-files/org1.example.com/peer0/msp/admincerts

cp fabric-ca-files/org1.example.com/admin/msp/signcerts/cert.pem fabric-ca-files/org1.example.com/peer0/msp/admincerts/

创建peer1.org1.example.com
使用[email protected]注册账号peer1.org1.example.com。这时候指定的目录是fabric-ca-files/org1.example.com/admin/。

fabric-ca-client register -H `pwd`/fabric-ca-files/org1.example.com/admin --id.secret=password  --id.name peer1.org1.example.com --id.type peer --id.affiliation "com.example.org1" --id.maxenrollments "0" --id.attrs 'role=peer:ecert' --id.secret=password

fabric-ca-client enroll -u http://peer1.org1.example.com:password@localhost:7054 -H `pwd`/fabric-ca-files/org1.example.com/peer1

[email protected]的证书复制到fabric-ca-files/org1.example.com/peer1/msp/admincerts

mkdir fabric-ca-files/org1.example.com/peer1/msp/admincerts

cp fabric-ca-files/org1.example.com/admin/msp/signcerts/cert.pem fabric-ca-files/org1.example.com/peer1/msp/admincerts/

创建peer0.org2.example.com
使用[email protected]注册账号peer0.org2.example.com。这时候指定的目录是fabric-ca-files/org2.example.com/admin/。

fabric-ca-client register -H `pwd`/fabric-ca-files/org2.example.com/admin --id.secret=password  --id.name peer0.org2.example.com --id.type peer --id.affiliation "com.example.org2" --id.maxenrollments "0" --id.attrs 'role=peer:ecert'  --id.secret=password

fabric-ca-client enroll -u http://peer0.org2.example.com:password@localhost:7054 -H `pwd`/fabric-ca-files/org2.example.com/peer0

[email protected]的证书复制到fabric-ca-files/org2.example.com/peer0/msp/admincerts

mkdir fabric-ca-files/org2.example.com/peer0/msp/admincerts

cp fabric-ca-files/org2.example.com/admin/msp/signcerts/cert.pem fabric-ca-files/org2.example.com/peer0/msp/admincerts/

创建peer1.org2.example.com
使用[email protected]注册账号peer0.org2.example.com。这时候指定的目录是fabric-ca-files/org2.example.com/admin/。

fabric-ca-client register -H `pwd`/fabric-ca-files/org2.example.com/admin --id.secret=password  --id.name peer1.org2.example.com --id.type peer --id.affiliation "com.example.org2" --id.maxenrollments "0" --id.attrs 'role=peer:ecert --id.secret=password

fabric-ca-client enroll -u http://peer1.org2.example.com:password@localhost:7054 -H `pwd`/fabric-ca-files/org2.example.com/peer1

[email protected]的证书复制到fabric-ca-files/org2.example.com/peer1/msp/admincerts

mkdir fabric-ca-files/org2.example.com/peer1/msp/admincerts

cp fabric-ca-files/org2.example.com/admin/msp/signcerts/cert.pem fabric-ca-files/org2.example.com/peer1/msp/admincerts/

五:进行替换然后手动执行验证

1:替换

根据原来通过generateArtifacts.sh脚本生成的crypto-config文件夹的结构进行分析,只需要将我们生成的msp更新对应的msp即可:(保留原msp里边的tlscacerts文件夹)。
主要操作,删除原crypto-config文件夹中对应的msp,然后从自己生成的/opt/gopath/fabric-ca-files文件夹中进行复制。

Example.com的msp

	  Order的msp

	  user下的admin的msp

Org1 的msp

      Peer0的msp

      Peer1的msp

      User的admin的msp

Org2的msp

      Peer0的msp

      Peer1的msp

      user的admin的msp

最后需要把org1和org2下msp/cacerts的证书文件重命名,在创建通道配置文件时需要用。
HyperLedger Fabric中Fabric-CA的使用_第4张图片
HyperLedger Fabric中Fabric-CA的使用_第5张图片
2:验证:
1:修改generateArtifacts.sh ,不生成证书和密钥
在这里插入图片描述
2:修改network_start.sh 中down的时候不删除这个存证书和密钥的文件夹
修改为:rm -rf channel-artifacts/.block channel-artifacts/.tx
up的时候:
HyperLedger Fabric中Fabric-CA的使用_第6张图片
3:直接执行sudo ./network_setup.sh up启动网络,出现EDN-E2E表明成功。
HyperLedger Fabric中Fabric-CA的使用_第7张图片

你可能感兴趣的:(fabric,fabric,ca)