前言

前段时间根据官方文档梳理了 Frabic CA 部署流程 ,今天试着使用 Docker 在本地搭建 CA 网络。

实验过程

实验环境

Ubuntu 18.04.5 Desktop

  • Docker version 19.03.12
  • Docker Compose version 1.26.2
  • Go version go1.15.1

拓扑结构

TLS CA

  • 提供 TLS (根)证书
  • 禁用 TLS 双向认证

Org0:

  • CA
  • Orderer

Org1:

  • CA
  • Peer1
  • Peer2

Org2:

  • CA
  • Peer1
  • Peer2

准备工作

  1. 安装 docker、docker-compose、golang,按照各个官方的教程安装即可

  2. 创建临时目录 ~\fabric-network,用于存放文件

1
mkdir fabric-network && cd fabric-network
  1. 安装 fabric-ca-client

使用以下方法安装时总是失败x

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 安装必要依赖
sudo apt install libtool libltdl-dev

# 启用 Go Modules 功能
go env -w GO111MODULE=on

# 配置阿里云镜像
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct

# 确认配置成功
go env | grep GOPROXY
# GOPROXY="https://mirrors.aliyun.com/goproxy/,direct"

# 安装 fabric-ca-client
go get -u github.com/hyperledger/fabric-ca/cmd/fabric-ca-client

直接下载压缩包解压(无 configtxgen 工具)

1
2
3
4
5
# 下载 1.4.0 版本
wget https://github.com/hyperledger/fabric-ca/releases/download/v1.4.0/hyperledger-fabric-ca-linux-amd64-1.4.0.tar.gz

# 解压
sudo tar -C /usr/local -xzf hyperledger-fabric-ca-linux-amd64-1.4.0.tar.gz

推荐方法

1
2
3
4
5
wget https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh
chmod +x bootstrap.sh

# 添加到环境变量
export PATH=/home/jck/fabric-network/fabric-samples/bin:$PATH
  1. docker-compose.yaml

官方提供的 docker-compose.rst 需要进行格式化和重命名。

本实验中整合的 docker-compose.yaml ,根据 container_name 按需启动容器

1
docker-compose up -d container_name

TLS CA

搭建 TLS CA

1
2
# 创建并启动容器
docker-compose up -d ca-tls

启动容器后完成初始化

  • 生成配置文件 fabric-ca-server-config.yaml
  • 生成公私钥
    • 公钥证书 ca-cert.pem
    • 私钥 /msp/keystore/*_sk
  • 初始化数据库 fabric-ca-server.db
  • 注册管理员账户(tls-ca-admin:tls-ca-adminpw

登记 TLS CA 管理员

登记(Enroll)后获得 TLS CA 的根证书,以及 TLS CA 返回的公私钥。docker-compose 启动容器时在本地创建的文件夹是 root 权限,直接用 sudo 可以执行但比较麻烦,这里进行权限更改。

1
2
3
4
5
6
7
8
9
10
11
# 更改文件夹所有权
sudo chown jck /tmp/hyperledger/

# 环境变量设置
## TLS CA 根证书路径
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem
## TLS CA 管理员的客户端路径
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/fabric-ca-tls/admin

# 登记管理员
fabric-ca-client enroll -d -u https://tls-ca-admin:tls-ca-adminpw@0.0.0.0:7052 --tls.certfiles /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem

向 TLS CA 进行注册

为各个组织的节点向 TLS CA 进行注册

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052 --tls.certfiles /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem

fabric-ca-client register -d --id.name peer2-org1 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7052 --tls.certfiles /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem

fabric-ca-client register -d --id.name peer1-org2 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7052 --tls.certfiles /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem

fabric-ca-client register -d --id.name peer2-org2 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7052 --tls.certfiles /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem

fabric-ca-client register -d --id.name orderer1-org0 --id.secret ordererPW --id.type orderer -u https://0.0.0.0:7052 --tls.certfiles /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem

fabric-ca-client register -d --id.name admin-org0 --id.secret org0AdminPW --id.type admin -u https://0.0.0.0:7052 --tls.certfiles /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem

fabric-ca-client register -d --id.name admin-org1 --id.secret org1AdminPW --id.type admin -u https://0.0.0.0:7052 --tls.certfiles /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem

fabric-ca-client register -d --id.name admin-org2 --id.secret org2AdminPW --id.type admin -u https://0.0.0.0:7052 --tls.certfiles /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem

ORG CA

搭建 ORG CA

和搭建 TLS CA 的方法如出一辙,容器启动后完成初始化工作

1
docker-compose up -d org0 org1 org2

登记 ORG CA 管理员 | 向 ORG CA 进行注册

各个组织中的节点需要向组织 CA 进行注册

Org0

Org0 包含一个 Admin 节点和一个 Order 节点

1
2
3
4
5
6
7
8
9
10
11
12
13
# 环境变量设置
## Org0 CA 根证书路径
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/ca/crypto/ca-cert.pem
## Org0 CA 管理员的客户端路径
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/ca/admin

# 登记 Org0 CA 管理员
fabric-ca-client enroll -d -u https://org0-admin:org0-adminpw@0.0.0.0:7053 --tls.certfiles /tmp/hyperledger/org0/ca/crypto/ca-cert.pem

# 向 Org0 CA 进行注册
fabric-ca-client register -d --id.name orderer1-org0 --id.secret ordererpw --id.type orderer -u https://0.0.0.0:7053 --tls.certfiles /tmp/hyperledger/org0/ca/crypto/ca-cert.pem

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 --tls.certfiles /tmp/hyperledger/org0/ca/crypto/ca-cert.pem

Org1

Org1 包含一个 Admin 节点、一个 User 节点以及两个 Peer 节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 环境变量设置
## Org1 CA 根证书路径
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/ca/crypto/ca-cert.pem
## Org1 CA 管理员的客户端路径
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/ca/admin

# 登记 Org1 CA 管理员
fabric-ca-client enroll -d -u https://org1-admin:org1-adminpw@0.0.0.0:7054 --tls.certfiles /tmp/hyperledger/org1/ca/crypto/ca-cert.pem

# 向 Org1 进行注册
fabric-ca-client register -d --id.name peer1-org1 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7054 --tls.certfiles /tmp/hyperledger/org1/ca/crypto/ca-cert.pem

fabric-ca-client register -d --id.name peer2-org1 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7054 --tls.certfiles /tmp/hyperledger/org1/ca/crypto/ca-cert.pem

fabric-ca-client register -d --id.name admin-org1 --id.secret org1AdminPW --id.type admin -u https://0.0.0.0:7054 --tls.certfiles /tmp/hyperledger/org1/ca/crypto/ca-cert.pem

fabric-ca-client register -d --id.name user-org1 --id.secret org1UserPW --id.type client -u https://0.0.0.0:7054 --tls.certfiles /tmp/hyperledger/org1/ca/crypto/ca-cert.pem

Org2

Org2 包含一个 Admin 节点、一个 User 节点以及两个 Peer 节点

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 环境变量设置
## Org2 CA 根证书路径
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/ca/crypto/ca-cert.pem
## Org2 CA 管理员的客户端路径
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org2/ca/admin

# 登记 Org2 CA 管理员
fabric-ca-client enroll -d -u https://org2-admin:org2-adminpw@0.0.0.0:7055 --tls.certfiles /tmp/hyperledger/org2/ca/crypto/ca-cert.pem

# 向 Org2 进行注册
fabric-ca-client register -d --id.name peer1-org2 --id.secret peer1PW --id.type peer -u https://0.0.0.0:7055 --tls.certfiles /tmp/hyperledger/org2/ca/crypto/ca-cert.pem

fabric-ca-client register -d --id.name peer2-org2 --id.secret peer2PW --id.type peer -u https://0.0.0.0:7055 --tls.certfiles /tmp/hyperledger/org2/ca/crypto/ca-cert.pem

fabric-ca-client register -d --id.name admin-org2 --id.secret org2AdminPW --id.type admin -u https://0.0.0.0:7055 --tls.certfiles /tmp/hyperledger/org2/ca/crypto/ca-cert.pem

fabric-ca-client register -d --id.name user-org2 --id.secret org2UserPW --id.type client -u https://0.0.0.0:7055 --tls.certfiles /tmp/hyperledger/org2/ca/crypto/ca-cert.pem

Org1

Org1-Peer1

向 Org1 CA 进行登记,获得所属组织的 ORG CA 证书

1
2
3
4
5
6
7
8
9
10
11
# 创建文件夹
mkdir -p /tmp/hyperledger/org1/peer1/assets/ca/
cp /tmp/hyperledger/org1/ca/crypto/ca-cert.pem /tmp/hyperledger/org1/peer1/assets/ca/org1-ca-cert.pem

# 环境变量
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/peer1
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/ca/org1-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp

# 登记
fabric-ca-client enroll -d -u https://peer1-org1:peer1PW@0.0.0.0:7054 --tls.certfiles /tmp/hyperledger/org1/ca/crypto/ca-cert.pem

向 TLS CA 进行登记,获得 TLS 证书

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建文件夹
mkdir -p /tmp/hyperledger/org1/peer1/assets/tls-ca
cp /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem /tmp/hyperledger/org1/peer1/assets/tls-ca/tls-ca-cert.pem

# 环境变量
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/tls-ca/tls-ca-cert.pem

# 登记
fabric-ca-client enroll -d -u https://peer1-org1:peer1PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer1-org1 --tls.certfiles /tmp/hyperledger/org1/peer1/assets/tls-ca/tls-ca-cert.pem

# 修改文件名
mv /tmp/hyperledger/org1/peer1/tls-msp/keystore/*_sk /tmp/hyperledger/org1/peer1/tls-msp/keystore/key.pem

Org1-Peer2

向 Org1 CA 进行登记,获得所属组织的 ORG CA 证书

1
2
3
4
5
6
7
8
9
10
11
# 创建文件夹
mkdir -p /tmp/hyperledger/org1/peer2/assets/ca/
cp /tmp/hyperledger/org1/ca/crypto/ca-cert.pem /tmp/hyperledger/org1/peer2/assets/ca/org1-ca-cert.pem

# 环境变量
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/peer2
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer2/assets/ca/org1-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp

# 登记
fabric-ca-client enroll -d -u https://peer2-org1:peer2PW@0.0.0.0:7054 --tls.certfiles /tmp/hyperledger/org1/ca/crypto/ca-cert.pem

向 TLS CA 进行登记,获得 TLS 证书

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建文件夹
mkdir -p /tmp/hyperledger/org1/peer2/assets/tls-ca/
cp /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem /tmp/hyperledger/org1/peer2/assets/tls-ca/tls-ca-cert.pem

# 环境变量
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer2/assets/tls-ca/tls-ca-cert.pem

# 登记
fabric-ca-client enroll -d -u https://peer2-org1:peer2PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer2-org1 --tls.certfiles /tmp/hyperledger/org1/peer2/assets/tls-ca/tls-ca-cert.pem

# 修改文件名
mv /tmp/hyperledger/org1/peer2/tls-msp/keystore/*_sk /tmp/hyperledger/org1/peer2/tls-msp/keystore/key.pem

Org1 Admin

向 Org1 CA 进行登记,获得所属组织的 ORG CA 证书

1
2
3
4
5
6
7
# 环境变量
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org1/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/ca/org1-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp

# 登记
fabric-ca-client enroll -d -u https://admin-org1:org1AdminPW@0.0.0.0:7054 --tls.certfiles /tmp/hyperledger/org1/peer1/assets/ca/org1-ca-cert.pem

向 TLS CA 进行登记,获得 TLS 证书

1
2
3
4
5
6
# 环境变量
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org1/peer1/assets/tls-ca/tls-ca-cert.pem

# 登记
fabric-ca-client enroll -d -u https://admin-org1:org1AdminPW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts admin-org1 --tls.certfiles /tmp/hyperledger/org1/peer1/assets/tls-ca/tls-ca-cert.pem

创建 admincerts 文件夹,并复制证书。官方文档 有给出创建本地 MSP 需要包含的文件夹,admincerts 是必须有的。

1
2
3
4
5
mkdir /tmp/hyperledger/org1/peer1/msp/admincerts
cp /tmp/hyperledger/org1/admin/msp/signcerts/cert.pem /tmp/hyperledger/org1/peer1/msp/admincerts/org1-admin-cert.pem

mkdir /tmp/hyperledger/org1/peer2/msp/admincerts
cp /tmp/hyperledger/org1/admin/msp/signcerts/cert.pem /tmp/hyperledger/org1/peer2/msp/admincerts/org1-admin-cert.pem

Org2

Org2-Peer1

向 Org2 CA 进行登记,获得所属组织的 ORG CA 证书

1
2
3
4
5
6
7
8
9
10
11
# 创建文件夹
mkdir -p /tmp/hyperledger/org2/peer1/assets/ca
cp /tmp/hyperledger/org2/ca/crypto/ca-cert.pem /tmp/hyperledger/org2/peer1/assets/ca/org2-ca-cert.pem

# 环境变量
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org2/peer1
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer1/assets/ca/org2-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp

# 登记
fabric-ca-client enroll -d -u https://peer1-org2:peer1PW@0.0.0.0:7055 --tls.certfiles /tmp/hyperledger/org2/peer1/assets/ca/org2-ca-cert.pem

向 TLS CA 进行登记,获得 TLS 证书

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建文件夹
mkdir /tmp/hyperledger/org2/peer1/assets/tls-ca
cp /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem /tmp/hyperledger/org2/peer1/assets/tls-ca/tls-ca-cert.pem

# 环境变量
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer1/assets/tls-ca/tls-ca-cert.pem

# 登记
fabric-ca-client enroll -d -u https://peer1-org2:peer1PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer1-org2 --tls.certfiles /tmp/hyperledger/org2/peer1/assets/tls-ca/tls-ca-cert.pem

# 修改文件名
mv /tmp/hyperledger/org2/peer1/tls-msp/keystore/*_sk /tmp/hyperledger/org2/peer1/tls-msp/keystore/key.pem

Org2-Peer2

向 Org2 CA 进行登记,获得所属组织的 ORG CA 证书

1
2
3
4
5
6
7
8
9
10
11
# 创建文件夹
mkdir -p /tmp/hyperledger/org2/peer2/assets/ca
cp /tmp/hyperledger/org2/ca/crypto/ca-cert.pem /tmp/hyperledger/org2/peer2/assets/ca/org2-ca-cert.pem

# 环境变量
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org2/peer2
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer2/assets/ca/org2-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp

# 登记
fabric-ca-client enroll -d -u https://peer2-org2:peer2PW@0.0.0.0:7055 --tls.certfiles /tmp/hyperledger/org2/peer2/assets/ca/org2-ca-cert.pem

向 TLS CA 进行登记,获得 TLS 证书

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建文件夹
mkdir /tmp/hyperledger/org2/peer2/assets/tls-ca
cp /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem /tmp/hyperledger/org2/peer2/assets/tls-ca/tls-ca-cert.pem

# 环境变量
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer2/assets/tls-ca/tls-ca-cert.pem

# 登记
fabric-ca-client enroll -d -u https://peer2-org2:peer2PW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts peer2-org2 --tls.certfiles /tmp/hyperledger/org2/peer2/assets/tls-ca/tls-ca-cert.pem

# 修改文件名
mv /tmp/hyperledger/org2/peer2/tls-msp/keystore/*_sk /tmp/hyperledger/org2/peer2/tls-msp/keystore/key.pem

Org2 Admin

向 Org2 CA 进行登记,获得所属组织的 ORG CA 证书

1
2
3
4
5
6
7
# 环境变量
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org2/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer1/assets/ca/org2-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp

# 登记
fabric-ca-client enroll -d -u https://admin-org2:org2AdminPW@0.0.0.0:7055 --tls.certfiles /tmp/hyperledger/org2/peer1/assets/ca/org2-ca-cert.pem

向 TLS CA 进行登记,获得 TLS 证书

1
2
3
4
5
6
# 环境变量
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer1/assets/tls-ca/tls-ca-cert.pem

# 登记
fabric-ca-client enroll -d -u https://admin-org2:org2AdminPW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts admin-org2 --tls.certfiles /tmp/hyperledger/org2/peer1/assets/tls-ca/tls-ca-cert.pem

创建 admincerts 文件夹,并复制证书

1
2
3
4
5
mkdir /tmp/hyperledger/org2/peer1/msp/admincerts
cp /tmp/hyperledger/org2/admin/msp/signcerts/cert.pem /tmp/hyperledger/org2/peer1/msp/admincerts/org2-admin-cert.pem

mkdir /tmp/hyperledger/org2/peer2/msp/admincerts
cp /tmp/hyperledger/org2/admin/msp/signcerts/cert.pem /tmp/hyperledger/org2/peer2/msp/admincerts/org2-admin-cert.pem

启动 Peer 节点

1
docker-compose up -d peer1-org1 peer2-org1 peer1-org2 peer2-org2

Org0

Org0-Order

向 Org0 CA 进行登记,获得所属组织的 ORG CA 证书

1
2
3
4
5
6
7
8
9
10
11
# 创建文件夹
mkdir -p /tmp/hyperledger/org0/orderer/assets/ca/
cp /tmp/hyperledger/org0/ca/crypto/ca-cert.pem /tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem

# 环境变量
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/orderer
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp

# 登记
fabric-ca-client enroll -d -u https://orderer1-org0:ordererpw@0.0.0.0:7053 --tls.certfiles /tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem

向 TLS CA 进行登记,获得 TLS 证书

1
2
3
4
5
6
7
8
9
10
11
12
13
# 创建文件夹
mkdir /tmp/hyperledger/org0/orderer/assets/tls-ca/
cp /tmp/hyperledger/fabric-ca-tls/crypto/ca-cert.pem /tmp/hyperledger/org0/orderer/assets/tls-ca/tls-ca-cert.pem

# 环境变量
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/tls-ca/tls-ca-cert.pem

# 登记
fabric-ca-client enroll -d -u https://orderer1-org0:ordererPW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts orderer1-org0 --tls.certfiles /tmp/hyperledger/org0/orderer/assets/tls-ca/tls-ca-cert.pem

# 修改文件名
mv /tmp/hyperledger/org0/orderer/tls-msp/keystore/*_sk /tmp/hyperledger/org0/orderer/tls-msp/keystore/key.pem

Org0 Admin

向 Org0 CA 进行登记,获得所属组织的 ORG CA 证书

1
2
3
4
5
6
7
# 环境变量
export FABRIC_CA_CLIENT_HOME=/tmp/hyperledger/org0/admin
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem
export FABRIC_CA_CLIENT_MSPDIR=msp

# 登记
fabric-ca-client enroll -d -u https://admin-org0:org0adminpw@0.0.0.0:7053 --tls.certfiles /tmp/hyperledger/org0/orderer/assets/ca/org0-ca-cert.pem

向 TLS CA 进行登记,获得 TLS 证书

1
2
3
4
5
6
# 环境变量
export FABRIC_CA_CLIENT_MSPDIR=tls-msp
export FABRIC_CA_CLIENT_TLS_CERTFILES=/tmp/hyperledger/org2/peer1/assets/tls-ca/tls-ca-cert.pem

# 登记
fabric-ca-client enroll -d -u https://admin-org0:org0AdminPW@0.0.0.0:7052 --enrollment.profile tls --csr.hosts admin-org0 --tls.certfiles /tmp/hyperledger/org2/peer1/assets/tls-ca/tls-ca-cert.pem

创建 admincerts 文件夹,并复制证书

1
2
mkdir /tmp/hyperledger/org0/orderer/msp/admincerts
cp /tmp/hyperledger/org0/admin/msp/signcerts/cert.pem /tmp/hyperledger/org0/orderer/msp/admincerts/orderer-admin-cert.pem

配置 MSP & 交易通道 & 创世区块

添加配置文件

在 Org0,Org1, Org2 所有 msp 目录下添加 config.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
NodeOUs:
Enable: true
ClientOUIdentifier:
#修改对应的证书名称
Certificate: cacerts/0-0-0-0-7053.pem
OrganizationalUnitIdentifier: client
PeerOUIdentifier:
Certificate: cacerts/0-0-0-0-7053.pem
OrganizationalUnitIdentifier: peer
AdminOUIdentifier:
Certificate: cacerts/0-0-0-0-7053.pem
OrganizationalUnitIdentifier: admin
OrdererOUIdentifier:
Certificate: cacerts/0-0-0-0-7053.pem
OrganizationalUnitIdentifier: orderer

创建后复制到相应文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
cd /tmp/hyperledger
touch config.yaml

echo org0/admin/msp org0/orderer/msp | xargs -n 1 cp config.yaml
echo org1/admin/msp org1/peer1/msp org1/peer2/msp | xargs -n 1 cp config.yaml
echo org2/admin/msp org2/peer1/msp org2/peer2/msp | xargs -n 1 cp config.yaml
```

### msp 配置

整理文件夹,全部整合到 `/tmp/hyperledger/configtx`

```bash
# Org0
mkdir -p /tmp/hyperledger/configtx && cd /tmp/hyperledger/configtx
mkdir org0
cp -r ../org0/admin/msp org0/

cd org0/msp
mkdir tlscacerts && cd tlscacerts
cp /tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem ./

# Org1
cd /tmp/hyperledger/configtx
mkdir org1
cp -r ../org1/admin/msp org1/

cd org1/msp
mkdir tlscacerts && cd tlscacerts
cp /tmp/hyperledger/org1/admin/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem ./

# Org2
cd /tmp/hyperledger/configtx
mkdir org2
cp -r ../org2/admin/msp org2/

cd org2/msp
mkdir tlscacerts && cd tlscacerts
cp /tmp/hyperledger/org2/admin/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem ./

目录结构如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
.
├── org0
│   └── msp
│   ├── cacerts
│   ├── config.yaml
│   ├── IssuerPublicKey
│   ├── IssuerRevocationPublicKey
│   ├── keystore
│   ├── signcerts
│   ├── tlscacerts
│   └── user
├── org1
│   └── msp
│   ├── cacerts
│   ├── config.yaml
│   ├── IssuerPublicKey
│   ├── IssuerRevocationPublicKey
│   ├── keystore
│   ├── signcerts
│   ├── tlscacerts
│   └── user
└── org2
   └── msp
   ├── cacerts
   ├── config.yaml
  ├── IssuerPublicKey
   ├── IssuerRevocationPublicKey
   ├── keystore
   ├── signcerts
   ├── tlscacerts
   └── user

创世区块和通道

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 配置文件
cd /tmp/hyperledger/configtx
touch configtx.yaml

# 创建文件夹
cd /tmp/hyperledger/configtx
mkdir system-genesis-block
mkdir channel-artifacts

# 生成创世区块文件
configtxgen -profile TwoOrgsOrdererGenesis -channelID system-channel -outputBlock ./system-genesis-block/genesis.block

# 生成通道
export CHANNEL_NAME=mychannel
configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/${CHANNEL_NAME}.tx -channelID ${CHANNEL_NAME}

# 锚节点更新配置
export orgmsp=org1MSP
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/${orgmsp}anchors.tx -channelID ${CHANNEL_NAME} -asOrg ${orgmsp}

# 锚节点更新配置
export orgmsp=org2MSP
configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/${orgmsp}anchors.tx -channelID ${CHANNEL_NAME} -asOrg ${orgmsp}

启动 Order 节点 | 启动客户端

1
docker-compose up -d orderer1-org0 cli-org1 cli-org2

创建并加入通道

Org1-CLI

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 进入容器
docker exec -it cli-org1 bash

# 环境变量
export CHANNEL_NAME=mychannel
export ORDERER_CA=/tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org1/admin/msp

cd /tmp/hyperledger/configtx

# 创建通道
peer channel create -o orderer1-org0:7050 -c ${CHANNEL_NAME} --ordererTLSHostnameOverride orderer1-org0 -f ./channel-artifacts/${CHANNEL_NAME}.tx --outputBlock ./channel-artifacts/${CHANNEL_NAME}.block --tls --cafile ${ORDERER_CA}

# 加入通道
export CORE_PEER_ADDRESS=peer1-org1:7051
peer channel join -b ./channel-artifacts/mychannel.block

export CORE_PEER_ADDRESS=peer2-org1:7051
peer channel join -b ./channel-artifacts/mychannel.block

# 通道更新
export CORE_PEER_LOCALMSPID=org1MSP
peer channel update -o orderer1-org0:7050 --ordererTLSHostnameOverride orderer1-org0 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls --cafile $ORDERER_CA

Org2-CLI

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 进入容器
docker exec -it cli-org2 bash

# 加入通道
export CORE_PEER_MSPCONFIGPATH=/tmp/hyperledger/org2/admin/msp
export CORE_PEER_ADDRESS=peer1-org2:7051
peer channel join -b ./channel-artifacts/mychannel.block

export CORE_PEER_ADDRESS=peer2-org2:7051
peer channel join -b ./channel-artifacts/mychannel.block

cd /tmp/hyperledger/configtx

export CHANNEL_NAME=mychannel
export ORDERER_CA=/tmp/hyperledger/org0/orderer/tls-msp/tlscacerts/tls-0-0-0-0-7052.pem
export CORE_PEER_LOCALMSPID=org2MSP

# 通道更新
peer channel update -o orderer1-org0:7050 --ordererTLSHostnameOverride orderer1-org0 -c $CHANNEL_NAME -f ./channel-artifacts/${CORE_PEER_LOCALMSPID}anchors.tx --tls --cafile $ORDERER_CA

链码测试

PASS

实验没有继续进行下去,整个区块链的逻辑还没捋清楚,接下来用官方的 test network 进行实验,同时学习 Fabric 区块链的整体逻辑。

总结

根据官方教程并没有好好做出来xd 一边摸索一边参照网上大佬的教程顺利做到这里。test1test2 是实验中的命令整理,最终完成的实验的目录结构如下

可以理解 register 和 enroll ,目前来看 msp 和目录结构比较复杂容易混乱,弄清楚存放路径其他的操作基本上是一致的。

参阅