概述
在first-network例子中,msp的初始化是依赖工具生成,而fabric-ca是专门启动CA节点的。这部分的代码基本落实是这样的:
- 由start.sh启动
- 在start.sh中调用makeDocker.sh初始话docker compose.yaml文件;
- 在makeDocker.sh所创建的yaml文件里,每个容器所需要执行的脚本定义在script目录下,包括order、peer、ca等。其中run-fabric-ca.sh应该是测试节点。
writeRootFabricCA
功能:启动ROOT CA节点
镜像: hyperledger/fabric-ca
执行脚本: start-root-ca.sh
start-root-ca.sh 脚本主要做如下一些工作
- 初始话根证书CA服务器,执行init命令,执行完应生成一个自签名的根证书ca-cert.pem
fabric-ca-server init -b $BOOTSTRAP_USER_PASS
- 修改fabric-ca-server-config.yaml配置文件,修改的是组织结果配置部分
sed -i "/affiliations:/a \\ $aff" \
$FABRIC_CA_SERVER_HOME/fabric-ca-server-config.yaml
- 启动CA服务器(根证书)
fabric-ca-server start
writeIntermediateCA
功能:启动中间证书节点
镜像: hyperledger/fabric-ca
执行脚本: start-intermediate-ca.sh
start-intermediate-ca.sh 脚本主要做如下一些工作
- 等待根证书的节点启动
waitPort "root CA to start" 60 $ROOT_CA_LOGFILE $ROOT_CA_HOST 7054
- 初始话中间证书的CA服务器,这里PARENT_URL是根证书的URL
fabric-ca-server init -b $BOOTSTRAP_USER_PASS -u $PARENT_URL
- 修改fabric-ca-server-config.yaml,同根证书节点
- 启动CA服务器(中间证书),同根证书节点
writeSetupFabric
功能:注册order、peer节点的ID,以及创建创世区块等通道资源,在这个例子中请求注册获取ID是通过中间证书CA服务器
镜像: hyperledger/fabric-ca-tools
执行脚本: setup-fabric.sh 参考笔记《11.fabric-sample fabric-ca — setup-fabric.sh》
writeOrderer
功能:启动排序节点
镜像: hyperledger/fabric-ca-orderer
执行脚本: start-orderer.sh
start-orderer.sh 主要的工作如下:
- 注册排序节点的TLS证书
fabric-ca-client enroll -d --enrollment.profile tls -u $ENROLLMENT_URL -M /tmp/tls --csr.hosts $ORDERER_HOST
- 注册排序节点的认证证书
fabric-ca-client enroll -d -u $ENROLLMENT_URL -M $ORDERER_GENERAL_LOCALMSPDIR
- 创建本地的MSP文件夹
finishMSPSetup $ORDERER_GENERAL_LOCALMSPDIR
copyAdminCert $ORDERER_GENERAL_LOCALMSPDIR
- 启动排序节点
writePeer
功能:启动记账节点
镜像: hyperledger/fabric-ca-peer
执行脚本: start-peer.sh
start-peer.sh 主要工作如下:
- 生成服务端TLS证书和秘钥对
fabric-ca-client enroll -d --enrollment.profile tls -u
$ENROLLMENT_URL -M /tmp/tls --csr.hosts $PEER_HOST
- 生成客户端TLS证书和秘钥对,分别针对PEER和PEER CLI
# Generate client TLS cert and key pair for the peer
genClientTLSCert $PEER_NAME $CORE_PEER_TLS_CLIENTCERT_FILE $CORE_PEER_TLS_CLIENTKEY_FILE
# Generate client TLS cert and key pair for the peer CLI
genClientTLSCert $PEER_NAME /$DATA/tls/$PEER_NAME-cli-client.crt /$DATA/tls/$PEER_NAME-cli-client.key
- 生成认证证书,同排序节点
- 生成本地MSP文件,同排序节点
- 启动记账节点
writeRunFabric
功能:运行之前创建的fabric网络
镜像: hyperledger/fabric-ca-tools
执行脚本: run-fabric.sh,这部分和first-network比较类似,主要关注如下这个场景。
前置条件:在setup-fabric.sh 的registerPeerIdentities函数执行步骤中该用户信息被注册。
fabric-ca-client register -d --id.name $USER_NAME --id.secret $USER_PASS
- 利用revokeFabricUserAndGenerateCRL函数,将user的权限撤销,核心代码如下:
abric-ca-client revoke -d --revoke.name $USER_NAME --gencrl
备注:这部分是在admin权限下执行的
- 利用switchToUserIdentity函数将当前权限转为user,核心代码如下:
fabric-ca-client enroll -d -u https://$USER_NAME:$USER_PASS@$CA_HOST:7054
备注:相当于将当前的环境变量做了修改,在正式的生产环境下,这台服务器上应该是不会存在admin账户的。
- 此时执行链码会爆出权限错误,代码如下:
function queryAsRevokedUser {
set +e
logr "Querying the chaincode in the channel '$CHANNEL_NAME' on the peer '$PEER_HOST' as revoked user '$USER_NAME' ..."
local starttime=$(date +%s)
# Continue to poll until we get an expected response or reach QUERY_TIMEOUT
while test "$(($(date +%s)-starttime))" -lt "$QUERY_TIMEOUT"; do
sleep 1
peer chaincode query -C $CHANNEL_NAME -n mycc -c '{"Args":["query","a"]}' >& log.txt
if [ $? -ne 0 ]; then
err=$(cat log.txt | grep "access denied")
if [ "$err" != "" ]; then
logr "Expected error occurred when the revoked user '$USER_NAME' queried the chaincode in the channel '$CHANNEL_NAME'"
set -e
return 0
fi
fi
echo -n "."
done
set -e
cat log.txt
cat log.txt >> $RUN_SUMFILE
return 1
}