前情提要
之前看教程发现很多地方并不是为了最终的流程,而是为了解释为什么这么做,也有很多不理解导致操作的不好的地方。这里我重新弄一下。
目标
还是一个TLS CA,2个组织各2个节点,1个orderer节点。总共是11个镜像:
- tls-ca
- org0-ca
- org1-ca
- org2-ca
- peer1-org1
- peer2-org1
- peer1-org2
- peer2-org2
- orderer1-org0
- cli-org1
- cli-org2
(请善用CSDN自带的markdown目录功能)
开始搭建
空项目,testop,创建docker-compose.yml
准备4个CA
这4个在当前例子中的逻辑是并行的,互不影响,所以可以直接启动4个容器。我这里对文件夹结构做了一些调整
先忽略org1,org2,截图晚了。剩下的是4个ca文件夹。分别对因4个容器,这样做是想完全把每个容器隔离开,不要像教程中那样映射,有点乱(重复带来整齐划一的整洁)。
对应容器yml如下
version: "3"
networks:
fabric-ca: # 自定义一个网络
services:
# 7052
tls-ca:
image: hyperledger/fabric-ca:amd64-1.4.9
container_name: tls-ca
networks: # 然后在这里指定加入网络
- fabric-ca
ports:
- 7052:7052 # 监听7052
environment:
- FABRIC_CA_SERVER_CSR_CN= tls-ca # 这设置的是服务器的名称
- FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0 # 这设置的是主机位置
- FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto #服务器根目录
- FABRIC_CA_SERVER_TLS_ENABLED=true # 启用TLS通信,这样以来必须提供TLS证书的路径才能正常操作
- FABRIC_CA_SERVER_DEBUG=true # 启用debug,输出debug信息
- FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/fabric-ca/admin # 这里默认调整为admin 目录,这样不用每次进去export,也就是进去就是管理员权限的client
- FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/fabric-ca/crypto/ca-cert.pem # 当然TLS证书也直接设置为本C服务器的路径,省去拷贝,直接操作
volumes:
- ./tls-ca:/tmp/hyperledger/fabric-ca
command: sh -c 'fabric-ca-server start -d -b tls-ca-admin:tls-ca-adminpw --port 7052' # 命令还是启动一个CA服务器,端口换成7052,-d代表输出debug信息
# 7053
org0-ca:
image: hyperledger/fabric-ca:amd64-1.4.9
container_name: org0-ca
networks:
- fabric-ca
ports:
- 7053:7053
environment:
- FABRIC_CA_SERVER_CSR_CN=org0-ca
- FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
- FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_DEBUG=true
- FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/fabric-ca/admin
- FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/fabric-ca/crypto/ca-cert.pem
volumes:
- ./org0-ca:/tmp/hyperledger/fabric-ca
command: /bin/bash -c 'fabric-ca-server start -d -b org0-ca-admin:org0-ca-adminpw --port 7053'
# 7054
org1-ca:
image: hyperledger/fabric-ca:amd64-1.4.9
container_name: org1-ca
networks:
- fabric-ca
ports:
- 7054:7054
environment:
- FABRIC_CA_SERVER_CSR_CN=org1-ca
- FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
- FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_DEBUG=true
- FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/fabric-ca/admin
- FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/fabric-ca/crypto/ca-cert.pem
volumes:
- ./org1-ca:/tmp/hyperledger/fabric-ca
command: /bin/bash -c 'fabric-ca-server start -d -b org1-ca-admin:org1-ca-adminpw'
# 7055
org2-ca:
image: hyperledger/fabric-ca:amd64-1.4.9
container_name: org2-ca
networks:
- fabric-ca
ports:
- 7055:7055
environment:
- FABRIC_CA_SERVER_CSR_CN=org2-ca
- FABRIC_CA_SERVER_CSR_HOSTS=0.0.0.0
- FABRIC_CA_SERVER_HOME=/tmp/hyperledger/fabric-ca/crypto
- FABRIC_CA_SERVER_TLS_ENABLED=true
- FABRIC_CA_SERVER_DEBUG=true
- FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/fabric-ca/admin
- FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/fabric-ca/crypto/ca-cert.pem
volumes:
- ./org2-ca:/tmp/hyperledger/fabric-ca
command: /bin/bash -c 'fabric-ca-server start -d -b org2-ca-admin:org2-ca-adminpw --port 7055'
然后对4个节点分别进行身份注册,就是用下面的命令从宿主机进入,然后进行容器内操作:
docker exec -it <容器名> bash
tls-ca
fabric-ca-client enroll -d -u https://tls-ca-admin:tls-ca-adminpw@0.0.0.0:7052
fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer2-org1 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer1-org2 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name peer2-org2 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7052
fabric-ca-client register -d --id.name orderer1-org0 --id.secret ordererPW --id.type orderer -u https://0.0.0.0:7052
orderer-ca
fabric-ca-client enroll -d -u https://org0-ca-admin:org0-ca-adminpw@0.0.0.0:7053
fabric-ca-client register -d --id.name orderer1-org0 --id.secret ordererpw --id.type orderer -u https://0.0.0.0:7053
fabric-ca-client register -d --id.name admin-org0 --id.secret org0adminpw --id.type admin --id.attrs "hf.Registrar.Roles=client,hf.Registrar.Attributes=*,hf.Revoker=true,hf.GenCRL=true,admin=true:ecert,abac.init=true:ecert" -u https://0.0.0.0:7053
注意: 我把一些用户名和密码改了。
org1的ca
fabric-ca-client enroll -d -u https://org1-ca-admin:org1-ca-adminpw@0.0.0.0:7054
fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name peer2-org1 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7054
fabric-ca-client register -d --id.name admin-org1 --id.secret org1AdminPW --id.type admin --id.attrs "hf.Registrar.Roles=client,hf.Registrar.Attributes=*,hf.Revoker=true,hf.GenCRL=true,admin=true:ecert,abac.init=true:ecert" -u https://0.0.0.0:7054 # 这里请注意,我之前没加上,导致名字是admin,但是没有admin的权限
fabric-ca-client register -d --id.name user-org1 --id.secret org1UserPW --id.type user -u https://0.0.0.0:7054
org2的ca
fabric-ca-client enroll -d -u https://org2-ca-admin:org2-ca-adminpw@0.0.0.0:7055
fabric-ca-client register -d --id.name peer1-org2 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7055
fabric-ca-client register -d --id.name peer2-org2 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7055
fabric-ca-client register -d --id.name admin-org2 --id.secret org2AdminPW --id.type admin --id.attrs "hf.Registrar.Roles=client,hf.Registrar.Attributes=*,hf.Revoker=true,hf.GenCRL=true,admin=true:ecert,abac.init=true:ecert" -u https://0.0.0.0:7055 # 这里请注意,我之前没加上,导致名字是admin,但是没有admin的权限
fabric-ca-client register -d --id.name user-org2 --id.secret org2UserPW --id.type user -u https://0.0.0.0:7055
准备4个普通节点
这次从宿主机(我的电脑)启动命令行,进入root权限,如下(就是先设置root密码,再输入su,输入密码,得到下图,然后cd到项目目录),然后把本机的fabric-ca-client路径添加到PATH变量(我的是在.bashrc里添加的,所以切换到root没了)
Local peer MSP
创建相应节点的文件夹,直接创建到assets,用来存放各CA服务器的材料
然后拷贝相应文件过来,这一步相当于从各个CA服务器拷贝东西到节点主机里(我这里只贴了一条,自己做一下,4个节点,一共4次,别弄错了名字)
然后可以在root窗口下,为几个节点颁发凭证。
peer1-org1
export FABRIC_CA_CLIENT_HOME=./org1/peer1
export FABRIC_CA_CLIENT_TLS_CERTFILES=./assets/ca/org1-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp # 会在FABRIC_CA_CLIENT_HOME下创建msp文件夹
fabric-ca-client enroll -d -u https://peer1-org1:peer1PW@0.0.0.0:7054
peer2-org1
export FABRIC_CA_CLIENT_HOME=./org1/peer2
export FABRIC_CA_CLIENT_TLS_CERTFILES=./assets/ca/org1-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp # 会在FABRIC_CA_CLIENT_HOME下创建msp文件夹
fabric-ca-client enroll -d -u https://peer2-org1:peer2PW@0.0.0.0:7054
peer1-org2
export FABRIC_CA_CLIENT_HOME=./org2/peer1
export FABRIC_CA_CLIENT_TLS_CERTFILES=./assets/ca/org2-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp # 会在FABRIC_CA_CLIENT_HOME下创建msp文件夹
fabric-ca-client enroll -d -u https://peer1-org2:peer1PW@0.0.0.0:7055
peer2-org2
export FABRIC_CA_CLIENT_HOME=./org2/peer2
export FABRIC_CA_CLIENT_TLS_CERTFILES=./assets/ca/org2-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp # 会在FABRIC_CA_CLIENT_HOME下创建msp文件夹
fabric-ca-client enroll -d -u https://peer2-org2:peer2PW@0.0.0.0:7055
注意: 一定要看到输出信息是成功。也可以在启动的docker输出上看服务器的日志,要全都成功才行。
很快生成了4个节点的身份材料。
TLS CA MSP
创建文件夹tls-ca
拷贝tls的CA证书(同一个TLS CA,复制还是挺容易的,路径很简单)
为4个节点颁发TLS CA的凭证
peer1-org1
export FABRIC_CA_CLIENT_HOME=./org1/peer1
export FABRIC_CA_CLIENT_TLS_CERTFILES=./assets/tls-ca/tls-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=tls-msp # 会在FABRIC_CA_CLIENT_HOME下创建tls-msp文件夹
fabric-ca-client enroll -d -u https://peer1-org1:peer1PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer1-org1
peer2-org1
export FABRIC_CA_CLIENT_HOME=./org1/peer2
export FABRIC_CA_CLIENT_TLS_CERTFILES=./assets/tls-ca/tls-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=tls-msp # 会在FABRIC_CA_CLIENT_HOME下创建tls-msp文件夹
fabric-ca-client enroll -d -u https://peer2-org1:peer2PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer2-org1
peer1-org2
export FABRIC_CA_CLIENT_HOME=./org2/peer1
export FABRIC_CA_CLIENT_TLS_CERTFILES=./assets/tls-ca/tls-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=tls-msp # 会在FABRIC_CA_CLIENT_HOME下创建tls-msp文件夹
fabric-ca-client enroll -d -u https://peer1-org2:peer1PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer1-org2
peer2-org2
export FABRIC_CA_CLIENT_HOME=./org2/peer2
export FABRIC_CA_CLIENT_TLS_CERTFILES=./assets/tls-ca/tls-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=tls-msp # 会在FABRIC_CA_CLIENT_HOME下创建tls-msp文件夹
fabric-ca-client enroll -d -u https://peer2-org2:peer2PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer2-org2
改名,把tls-msp/keystore下的私钥改成key.pem。4次操作
Orgx Admin MSP
各组织管理员的颁发,主要是需要那个证书交给节点
org1的
export FABRIC_CA_CLIENT_HOME=./org1/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=../peer1/assets/ca/org1-ca-cert.pem # 这里使用peer1下复制来的ORG1 CA 证书
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://admin-org1:org1AdminPW@0.0.0.0:7054
mkdir ./org1/peer1/msp/admincerts
cp ./org1/admin/msp/signcerts/cert.pem ./org1/peer1/msp/admincerts/org1-admin-cert.pem
mkdir ./org1/peer2/msp/admincerts
cp ./org1/admin/msp/signcerts/cert.pem ./org1/peer2/msp/admincerts/org1-admin-cert.pem
org2的
export FABRIC_CA_CLIENT_HOME=./org2/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=../peer1/assets/ca/org2-ca-cert.pem # 这里使用peer1下复制来的ORG2 CA 证书
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://admin-org2:org2AdminPW@0.0.0.0:7055
mkdir ./org2/peer1/msp/admincerts
cp ./org2/admin/msp/signcerts/cert.pem ./org2/peer1/msp/admincerts/org2-admin-cert.pem
mkdir ./org2/peer2/msp/admincerts
cp ./org2/admin/msp/signcerts/cert.pem ./org2/peer2/msp/admincerts/org2-admin-cert.pem
搞定,现在每一个节点都有了相应的材料,通过assets/ca中的证书产生了Local Peer MSP(msp文件夹),通过assets/tls-ca中的证书产生了TLS CA MSP(tls-msp文件夹),并且将组织的管理员的证书拷贝到了msp/admincerts中。
现在启动节点。
启动之后,先看一下是否启动成功,再搜索一下这句话(有可能搜不到,日志刷的太快):
serve -> INFO 020 Started peer with ID=[name:“peer1-org1” ], network ID=[dev], address=[peer1-org1:7051]
docker ps -a # 看看有没有正常启动吧
准备1个排序节点
Local Orderer MSP
创建文件夹,拷贝
还是,这一步相当于从Orderer组织的CA服务器拷贝了证书到orderer节点主机上。
export FABRIC_CA_CLIENT_HOME=./org0/orderer
export FABRIC_CA_CLIENT_TLS_CERTFILES=./assets/ca/org1-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp # 会在FABRIC_CA_CLIENT_HOME下创建msp文件夹
fabric-ca-client enroll -d -u https://peer1-org1:peer1PW@0.0.0.0:7054
TLS CA MSP
创建文件夹,拷贝
继续,从TLS CA给orderer发凭证
export FABRIC_CA_CLIENT_HOME=./org0/orderer
export FABRIC_CA_CLIENT_TLS_CERTFILES=./assets/tls-ca/tls-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=tls-msp # 会在FABRIC_CA_CLIENT_HOME下创建tls-msp文件夹
fabric-ca-client enroll -d -u https://orderer1-org0:ordererPW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts orderer1-org0
改名,把tls-msp/keystore下的私钥改成key.pem。
Org0 Admin MSP
管理员的证书,生成,然后拷贝过去
export FABRIC_CA_CLIENT_HOME=./org0/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=../orderer/assets/ca/org0-ca-cert.pem # 这里使用orderer下复制来的ORG0 CA证书
export FABRIC_CA_CLIENT_MSPDIR=msp
fabric-ca-client enroll -d -u https://admin-org0:org0adminpw@0.0.0.0:7053
mkdir ./org0/orderer/msp/admincerts
cp ./org0/admin/msp/signcerts/cert.pem ./org0/orderer/msp/admincerts/org0-admin-cert.pem
创建创世区块和通道事务
得有这个才能启动排序节点。
收集所有组织的MSP。
按照结构收集3个org的证书,
./org0/orderer/orgs/org0/msp
├── admincerts
│ └── admin-org0-cert.pem
├── cacerts
│ └── org0-ca-cert.pem
├── tlscacerts
│ └── tls-ca-cert.pem
└── users
拷贝上一篇的configtx.yaml,放到./org0/orderer
运行如下
export FABRIC_CFG_PATH=./org0/orderer
configtxgen -profile OrgsOrdererGenesis -outputBlock ./org0/orderer/genesis.block -channelID syschannel
configtxgen -profile OrgsChannel -outputCreateChannelTx ./org0/orderer/channel.tx -channelID mychannel
得到结果
启动节点。
命令行容器
很简单,按照放在各自peer1上,直接启动就行
创建通道并加入
拷贝在orderer上生成的channel.tx到org1 peer1和org2 peer1的assets文件夹
进入cli
docker exec -it cli-org1 sh
还是不行,通道无法创建,提示某个地方缺失了policy,因为对配置文件不熟,现在还不知道哪里缺失了。
TODO 暂时放下,先去弄一下fabric本身,回头要部署了再来看。可能是configtx.yaml的问题,生成的通道有问题。