一、简介
在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:结构分析
这里做了简化,只部署了一个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的文件夹(里面是管理员的证书和私钥等信息):
通过上面启动后,默认创建两个组织。
执行
fabric-ca-client -H `pwd`/fabric-ca-files/admin affiliation list
(这是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的证书文件重命名,在创建通道配置文件时需要用。
2:验证:
1:修改generateArtifacts.sh ,不生成证书和密钥
2:修改network_start.sh 中down的时候不删除这个存证书和密钥的文件夹
修改为:rm -rf channel-artifacts/.block channel-artifacts/.tx
up的时候:
3:直接执行sudo ./network_setup.sh up启动网络,出现EDN-E2E表明成功。