Fabric1.4 七、CA环境集成与应用

本文基于hellowrold区块链环境,添加CA服务,并使用chaincode测试。

在helloworld案例中是由cryptogen这个工具根据crypto-config.yaml而生成用户信息。
但是在实际生产环境中,我们应该为每个Org建立一个CA,由CA来管理其中的用户。

1.新建docker-compose文件,增加CA容器

***docker-compose-ca.yaml***内容如下:

# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#

version: '2'

networks:
  hello:

services:
  ca0:
    image: hyperledger/fabric-ca
    environment:
      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
      - FABRIC_CA_SERVER_CA_NAME=ca-org1
      - FABRIC_CA_SERVER_TLS_ENABLED=true
      - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem
      - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/${PRIVATE_KEY1}
      - FABRIC_CA_SERVER_PORT=7054
    ports:
      - "7054:7054"
    command: sh -c '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_KEY1} -b admin:adminpw -d'
    volumes:
      - ./crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
      - ./client/ca:/root/ca
    container_name: ca_peerOrg1
    networks:
      - hello

  ca1:
    image: hyperledger/fabric-ca
    environment:
      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
      - FABRIC_CA_SERVER_CA_NAME=ca-org2
      - FABRIC_CA_SERVER_TLS_ENABLED=true
      - FABRIC_CA_SERVER_TLS_CERTFILE=/etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem
      - FABRIC_CA_SERVER_TLS_KEYFILE=/etc/hyperledger/fabric-ca-server-config/${PRIVATE_KEY2}
      - FABRIC_CA_SERVER_PORT=9054
    ports:
      - "9054:9054"
    command: sh -c 'fabric-ca-server start --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/${PRIVATE_KEY2} -b admin:adminpw -d'
    volumes:
      - ./crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config
      - ./client/ca:/root/ca
    container_name: ca_peerOrg2
    networks:
      - hello



Fabric CA Server启动的时候,带了3个重要的参数:

  • (1)ca.certfile :指定了CA的根证书。
  • (2)ca.keyfile :指定了接下来给新用户签发证书时的私钥,这里我们使用变量${PRIVATE_KEY}代替,这是因为每次network_setup的时候,私钥的名字是不一样的,所以需要从启动脚本中传入。
  • (3)-b参数:指定了CA Client连接CA Server时使用的用户名密码。

2.添加startCA.sh启动脚本,将CA容器启动的参数带入

我们需要新增加一个startCA.sh文件,因为前面我们使用了变量 P R I V A T E K E Y 1 和 {PRIVATE_KEY1}和 PRIVATEKEY1{PRIVATE_KEY2},
所以这里我们需要读取变量并带入docker-compose-ca.yaml 启动的时候。具体脚本如下:


COMPOSE_FILE="docker-compose-ca.yaml"
##########
#key1
folder1="crypto-config/peerOrganizations/org1.example.com/ca"
privName1=""
for file_a in ${folder1}/*
do
  temp_file=`basename $file_a`

  if [ ${temp_file##*.} != "pem" ];then
    privName1=$temp_file
  fi
done

echo $privName1

############
#key2
folder2="crypto-config/peerOrganizations/org2.example.com/ca"
privName2=""
for file_a in ${folder2}/*
do
  temp_file=`basename $file_a`

  if [ ${temp_file##*.} != "pem" ];then
    privName2=$temp_file
  fi
done
echo $privName2


CHANNEL_NAME=$CH_NAME TIMEOUT=$CLI_TIMEOUT PRIVATE_KEY1=$privName1 PRIVATE_KEY2=$privName2 docker-compose -f $COMPOSE_FILE up -d 2>&1


这里脚本的逻辑是去crypto-config/peerOrganizations/org1.example.com/ca这个文件夹中去遍历文件,找到后缀_sk的私钥文件的文件名,并把文件名赋值给privName,然后在docker-compse-ca的启动时,指定到PRIVATE_KEY。

3.使用CA Client生成新用户

通过前面2步,我们给Org1、Org2设置的CA Server。接下来我们需要安装ca client,用于访问和操作CA。

3.1启动Fabric网络

运行./startCA.sh

3.2下载并安装Fabric CA Client

然后执行以下命令安装Fabric CA Client:

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

该命令执行完毕后,我们应该在~/go/bin下面看到生成的2个文件:

fabric-ca-client fabric-ca-server

3.3注册认证管理员

首先需要以管理员身份使用CA Client连接到Org1的 CA Server,并生成相应的文件。

export FABRIC_CA_CLIENT_HOME=/Users/zgq/ca
fabric-ca-client enroll -u http://admin:adminpw@localhost:7054

这个时候我们可以去$HOME/ca目录,看到CA Client创建了一个fabric-ca-client-config.yaml文件和一个msp文件夹。config可以去修改一些组织信息之类的。

3.4注册新用户

接着新建一个叫zgq的用户,那么需要先执行这个命令:
fabric-ca-client register --id.name zgq --id.type user --id.affiliation org1.department1 --id.attrs ‘hf.Revoker=true,foo=bar’
系统会返回一个该用户的密码:

User provided config file: /Users/zgq/ca/fabric-ca-client-config.yaml
Configuration file location: /Users/zgq/ca/fabric-ca-client-config.yaml

Password: GOuMzkcGgGzq
拿到这个密码后就可以再次使用enroll命令,给zgq这个用户生成msp的私钥和证书:

fabric-ca-client enroll -u http://zgq:GOuMzkcGgGzq@localhost:7054 -M F A B R I C C A C L I E N T H O M E / z g q 现 在 新 用 户 d e v i n 的 私 钥 和 证 书 就 在 FABRIC_CA_CLIENT_HOME/zgq 现在新用户devin的私钥和证书就在 FABRICCACLIENTHOME/zgqdevinHOME/ca/devinmsp目录下,我们可以使用tree命令查看一下:


zgq/ 
├── cacerts 
│   └── localhost-7054.pem 
├── keystore 
│   └── a044e43ad1fd7cdfd1fd995abaef53895534bd70e8cdfdb665430d12665f2041_sk 
└── signcerts 
    └── cert.pem
 

4.编写ChainCode验证CA用户

4.1 编写链码

当前用户的信息的获取主要是用到ChainCode接口提供的GetCreator方法,具体的ChainCode如下:

sampleChaincode.go

package main

import (
   "github.com/hyperledger/fabric/core/chaincode/shim"
   pb "github.com/hyperledger/fabric/protos/peer"
   "fmt"
   "encoding/pem"
   "crypto/x509"
   "bytes"
)

type SimpleChaincode struct {
}

func main() {
   err := shim.Start(new(SimpleChaincode))
   if err != nil {
      fmt.Printf("Error starting Simple chaincode: %s", err)
   }
}
func (t *SimpleChaincode) Init(stub shim.ChaincodeStubInterface) pb.Response {
   return shim.Success(nil)
}


func (t *SimpleChaincode) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
   function, args := stub.GetFunctionAndParameters()
   fmt.Println("invoke is running " + function)
   if function == "cert" {//自定义函数名称
      return t.testCertificate(stub, args)//定义调用的函数
   }
   return shim.Error("Received unknown function invocation")
}
func (t *SimpleChaincode) testCertificate(stub shim.ChaincodeStubInterface, args []string) pb.Response{
   creatorByte,_:= stub.GetCreator()
   certStart := bytes.IndexAny(creatorByte, "-----")// Devin:I don't know why sometimes -----BEGIN is invalid, so I use -----
   if certStart == -1 {
      fmt.Errorf("No certificate found")
   }
   certText := creatorByte[certStart:]
   bl, _ := pem.Decode(certText)
   if bl == nil {
      fmt.Errorf("Could not decode the PEM structure")
   }
   fmt.Println(string(certText))
   cert, err := x509.ParseCertificate(bl.Bytes)
   if err != nil {
      fmt.Errorf("ParseCertificate failed")
   }
   fmt.Println(cert)
   uname:=cert.Subject.CommonName
   fmt.Println("Name:"+uname)
   return shim.Success([]byte("Called testCertificate "+uname))
}

4.2 安装链码比验证CA

#进入peer 客户端
docker exec -it cli_peer0_org1 bash
#安装
peer chaincode install -n sicc -p github.com/hyperledger/fabric/helloworld/chaincode/go/simplecc/ -v 1.0

ORDERER_CA=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
#实例化
peer chaincode instantiate -o orderer.example.com:7050 --tls --cafile $ORDERER_CA -C mychannel -n sicc -v 1.0 -c '{"Args":[]}' -P "OR ('Org1MSP.peer','Org2MSP.peer')"
#验证CA用户信息
peer chaincode query -C mychannel -n sicc -c '{"Args":["cert"]}'

系统返回结果,说明我们当前的用户是Admin@org1.example.com

5.验证新用户

设置新用户的证书和私钥文件夹,验证新用户的可用性。
我们已经给org1设置的CA,用户zgq是在org1下,所以需要把/Users/zgq/ca/zgq下面的文件转移到org1下面。org1的用户证书和私钥文件夹在:

~/go/src/fabric-examples/helloworld/crypto-config/peerOrganizations/org1.example.com/users

#新建文件夹zgq用于保存新用户的证书和私钥,新建命令行窗口,保留前面已经登录的cli_peer0_org1窗口,接下来还会用于验证CA用户。

cd ~/go/src/fabric-examples/helloworld/crypto-config/peerOrganizations/org1.example.com/users

mkdir zgq

cp ~/ca/zgq/ zgq/msp –R
#从signcerts这个文件夹中拷贝一个.pem到admincerts目录,运行以下命令:

mkdir zgq/msp/admincerts

cp zgq/msp/signcerts/cert.pem zgq/msp/admincerts/

新用户的所有证书准备完毕,tree zgq看看结果:

tree zgq

zgq/ 
└── msp 
    ├── admincerts 
    │   └── cert.pem 
    ├── cacerts 
    │   └── localhost-7054.pem 
    ├── keystore 
    │   └── a044e43ad1fd7cdfd1fd995abaef53895534bd70e8cdfdb665430d12665f2041_sk 
    └── signcerts 
        └── cert.pem

切换到cli_peer0_org1窗口,我们把当前用户msp文件夹切换成zgq的文件夹,具体命令是:


CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/devin/msp

接着再运行一下ChainCode:

peer chaincode query -C mychannel -n test1 -c '{"Args":["cert"]}'

可以看到结果已经变化了,用户已经由Admin变成了zgq。

关于CA其他内容可参考官方文档:http://hyperledger-fabric-ca.readthedocs.io/en/latest/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zone 7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值